作者：知乎用户 链接：https://www.zhihu.com/question/20451584/answer/2220757276 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。 我觉得抛开语法而谈，最主要的还是对底层的控制能力不同。C# 一开始虽然借鉴 Java，但是目的完全不是为了造一个 better Java，而是造一个 better C++。游戏引擎们偏爱 C# 也是有这一层原因在里面，这一点高赞回答中 @MaxwellGeng 的回答已经足够能说清了。 比如在 C# 里面你能干的： var x = new int[10]; fixed (int* p = x) { Console.WriteLine(*((long*)p - 1)); // 10 } 上述代码会输出 10，为什么？因为 .NET 中数组的长度存储于数组第一个元素之前的 8 字节内存中。如果你再接着输出 ((long)p - 2)，将会直接得到这个对象的 TypeHandle 地址： Console.WriteLine((long)typeof(int[]).TypeHandle.Value == *((long*)p - 2)); // True 然后拿着这个指针又接着能去访问对象的 MethodTable。 再有你还可以手动在栈上分配空间： var x = stackalloc int[2]; // 或者 Span<int> x = stackalloc int[2]; 做安全访存 x[0] = 3; x[1] = 1; Console.WriteLine(x[0] + x[1]); // 4 接着你想绕过 GC 直接手动分配堆内存： var array = (int*)NativeMemory.Alloc(10, sizeof(int)); array[0] = 1; array[1] = 3; Console.WriteLine(array[0] + array[1]); // 4 NativeMemory.Free(array); 上述调用等价于你在 C 语言中调用的 malloc，此外还有 AllocAligned、Realloc、AllocZeroed 等等，可以直接控制内存对齐。接下来你想创建一个显式内存布局的结构 Foo： var obj = new Foo(); obj.Float = 1; Console.WriteLine(obj.Int); // 1065353216 Console.WriteLine(obj.Bytes[0]); // 0 Console.WriteLine(obj.Bytes[1]); // 0 Console.WriteLine(obj.Bytes[2]); // 128 Console.WriteLine(obj.Bytes[3]); // 63 [StructLayout(LayoutKind.Explicit)] struct Foo { [FieldOffset(0)] public int Int; [FieldOffset(0)] public float Float; [FieldOffset(0)] public unsafe fixed byte Bytes[4]; } 然后你就成功模拟出了一个 C 的 Union，之所以会有上面的输出，是因为单精度浮点数 1 的二进制表示为 0x00111111100000000000000000000000，以小端方式存储后占 4 个字节，分别是 0x00000000、0x00000000、0x10000000、0x00111111。进一步，你还能直接从内存数据没有任何拷贝开销地构造对象： var data = stackalloc byte[] { 0, 0, 128, 63 }; var foo = Unsafe.AsRef<Foo>(data); Console.WriteLine(foo.Float); // 1 [StructLayout(LayoutKind.Explicit)] struct Foo { [FieldOffset(0)] public int Int; [FieldOffset(0)] public float Float; [FieldOffset(0)] public unsafe fixed byte Bytes[4]; } 甚至这样： var data = 1065353216; var foo = Unsafe.AsRef<Foo>(&data); Console.WriteLine(foo.Float); // 1 [StructLayout(LayoutKind.Explicit)] struct Foo { [FieldOffset(0)] public int Int; [FieldOffset(0)] public float Float; [FieldOffset(0)] public unsafe fixed byte Bytes[4]; } 从堆内存创建自然也没问题： var data = new byte[] { 0, 0, 128, 63 }; fixed (void* p = data) { var foo = Unsafe.AsRef<Foo>(p); Console.WriteLine(foo.Float); // 1 } [StructLayout(LayoutKind.Explicit)] struct Foo { [FieldOffset(0)] public int Int; [FieldOffset(0)] public float Float; [FieldOffset(0)] public unsafe fixed byte Bytes[4]; } 再比如，此时你面前有一个使用 C++ 编写的库，其中有这么一段代码： #include <cstring> #include <cstdio> extern "C" __declspec(dllexport) char* __cdecl foo(char* (*gen)(int), int count) { return gen(count); } 然后我们编写如下 C# 代码： [DllImport("./foo.dll", EntryPoint = "foo"), SuppressGCTransition] static extern string Foo(delegate* unmanaged[Cdecl]<int, nint> gen, int count); [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) }), SuppressGCTransition] static nint Generate(int count) { var str = Enumerable.Repeat("w", count).Aggregate((a, b) => $"{a}{b}"); return Marshal.StringToHGlobalAnsi(str); } var f = (delegate* unmanaged[Cdecl]<int, nint>)&Generate; var result = Foo(f, 5); Console.WriteLine(result); // wwwww 上面的代码干了什么事情？我们将 C# 的函数指针传到了 C++ 代码中，然后在 C++ 侧调用 C# 函数生成了一个字符串 wwwww，然后将这个字符串返回给 C# 侧。而就算不用函数指针换成使用委托也没有区别，因为 .NET 中的委托下面就是函数指针。甚至，如果我们不想让 .NET 导入 foo.dll，我们想自行决定动态库的生命周期，还可以这么写： [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) }), SuppressGCTransition] static nint Generate(int count) { var str = Enumerable.Repeat("w", count).Aggregate((a, b) => $"{a}{b}"); return Marshal.StringToHGlobalAnsi(str); } var f = (delegate* unmanaged[Cdecl]<int, nint>)&Generate; var library = NativeLibrary.Load("./foo.dll"); var foo = (delegate* unmanaged[Cdecl, SuppressGCTransition]<delegate* unmanaged[Cdecl]<int, nint>, int, string>)NativeLibrary.GetExport(library, "foo"); var result = foo(f, 5); Console.WriteLine(result); // wwwww NativeLibrary.Free(library); 上面这些都不是 Windows 专用，在 Linux、macOS 上导入 .so 和 .dylib 都完全不在话下。再有，我们有一些数据想要进行计算，但是我们想使用 SIMD 进行处理，那只需要这么写： var vec1 = Vector128.Create(1.1f, 2.2f, 3.3f, 4.4f); var vec2 = Vector128.Create(5.5f, 6.6f, 7.7f, 8.8f); Console.WriteLine(Calc(vec1, vec2)); float Calc(Vector128<float> l, Vector128<float> r) { if (Avx2.IsSupported) { var result = Avx2.Multiply(l, r); float sum = 0; for (var i = 0; i < Vector128<float>.Count; i++) sum += result.GetElement(i); return sum; } else if (Rdm.IsSupported) { var result = Rdm.Multiply(l, r); float sum = 0; for (var i = 0; i < Vector128<float>.Count; i++) sum += result.GetElement(i); return sum; } else { float sum = 0; for (int i = 0; i < Vector128<float>.Count; i++) { sum += l.GetElement(i) * r.GetElement(i); } return sum; } } 可以看看在 X86 平台上生成了什么代码： vzeroupper vmovupd xmm0, [r8] vmulps xmm0, xmm0, [r8+0x10] vmovaps xmm1, xmm0 vxorps xmm2, xmm2, xmm2 vaddss xmm1, xmm1, xmm2 vmovshdup xmm2, xmm0 vaddss xmm1, xmm2, xmm1 vunpckhps xmm2, xmm0, xmm0 vaddss xmm1, xmm2, xmm1 vshufps xmm0, xmm0, xmm0, 0xff vaddss xmm1, xmm0, xmm1 vmovaps xmm0, xmm1 ret 平台判断的分支会被 JIT 自动消除。但其实除了手动编写 SIMD 代码之外，前两个分支完全可以不写，而只留下： float Calc(Vector128<float> l, Vector128<float> r) { float sum = 0; for (int i = 0; i < Vector128<float>.Count; i++) { sum += l.GetElement(i) * r.GetElement(i); } return sum; } 因为现阶段当循环边界条件是向量长度时，.NET 会自动为我们做向量化并展开循环。那么继续，我们还有ref、in、out来做引用传递。假设我们有一个很大的 struct，我们为了避免传递时发生拷贝，可以直接用 in 来做只读引用传递： void Test(in Foo v) { } struct Foo { public long A, B, C, D, E, F, G, H, I, J, K, L, M, N; } 而对于小的 struct，.NET 有专门的优化帮我们彻底消除掉内存分配，完全将 struct 放在寄存器中，例如如下代码： double Test(int x1, int y1, int x2, int y2) { var p1 = new Point(x1, y1); var p2 = new Point(x2, y2); return GetDistance(p1, p2); } [MethodImpl(MethodImplOptions.AggressiveInlining)] double GetDistance(Point a, Point b) { return Math.Sqrt((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)); } struct Point { public Point(int x, int y) { X = x; Y = y; } public int X { get; set; } public int Y { get; set; } } 上述代码 GetDistance 考虑是个热点路径，因此我加 MethodImplOptions.AggressiveInlining 来指导 JIT 有保证地内联此函数，最后为 Test 生成了如下的代码： vzeroupper sub ecx, r8d mov eax, ecx imul eax, ecx sub edx, r9d mov ecx, edx imul edx, ecx add eax, edx vxorps xmm0, xmm0, xmm0 vcvtsi2sd xmm0, xmm0, eax vsqrtsd xmm0, xmm0, xmm0 ret 全程没有一句指令访存，非常的高效。我们还可以借用 ref 的引用语义来做原地更新： var vec = new Vector(10); vec[2] = 5; Console.WriteLine(vec[2]); // 5 ref var x = ref vec[3]; x = 7; Console.WriteLine(vec[3]); // 7 class Vector { private int[] _array; public Vector(int count) => _array = new int[count]; public ref int this[int index] => ref _array[index]; } 甚至还能搭配指针和手动分配内存来使用： var vec = new Vector(10); vec[2] = 5; Console.WriteLine(vec[2]); // 5 ref var x = ref vec[3]; x = 7; Console.WriteLine(vec[3]); // 7 unsafe class Vector { private int* _memory; public Vector(uint count) => _memory = (int*)NativeMemory.Alloc(count, sizeof(int)); public ref int this[int index] => ref _memory[index]; ~Vector() => NativeMemory.Free(_memory); } C# 的泛型不像 Java 采用擦除，而是真真正正会对所有的类型参数特化代码（尽管对于引用类型会共享实现采用运行时分发），这也就意味着能最大程度确保性能，并且对应的类型拥有根据类型参数大小不同而特化的内存布局。还是上面那个 Point 的例子，我们将下面的数据 int 换成泛型参数 T，并做值类型数字的泛型约束： double Test1(double x1, double y1, double x2, double y2) { var p1 = new Point<double>(x1, y1); var p2 = new Point<double>(x2, y2); var result = GetDistanceSquare(p1, p2); return Math.Sqrt(result); } double Test2(int x1, int y1, int x2, int y2) { var p1 = new Point<int>(x1, y1); var p2 = new Point<int>(x2, y2); var result = GetDistanceSquare(p1, p2); return Math.Sqrt(result); } [MethodImpl(MethodImplOptions.AggressiveInlining)] T GetDistanceSquare<T>(Point<T> a, Point<T> b) where T : struct, IBinaryNumber<T> { return (a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y); } struct Point<T> where T : struct, IBinaryNumber<T> { public Point(T x, T y) { X = x; Y = y; } public T X { get; set; } public T Y { get; set; } } 无论是 Test1 还是 Test2，生成的代码都非常优秀，不仅不存在任何的装箱拆箱，甚至没有任何的访存操作： ; Test1 vzeroupper vsubsd xmm0, xmm0, xmm2 vmovaps xmm2, xmm0 vmulsd xmm0, xmm0, xmm2 vsubsd xmm1, xmm1, xmm3 vmovaps xmm2, xmm1 vmulsd xmm1, xmm1, xmm2 vaddsd xmm0, xmm1, xmm0 vsqrtsd xmm0, xmm0, xmm0 ret ; Test2 vzeroupper sub ecx, r8d mov eax, ecx imul eax, ecx sub edx, r9d mov ecx, edx imul edx, ecx add eax, edx vxorps xmm0, xmm0, xmm0 vcvtsi2sd xmm0, xmm0, eax vsqrtsd xmm0, xmm0, xmm0 ret 接着讲，我们有时候为了高性能想要临时暂停 GC 的回收，只需要简单的一句： GC.TryStartNoGCRegion(1024 * 1024 * 128); 就能告诉 GC 如果还能分配 128mb 内存那就不要做回收了，然后一段时间内以后的代码我们尽管在这个预算内分配内存，任何 GC 都不会发生。甚至还能阻止在内存不够分配的情况下进行阻塞式 Full GC： GC.TryStartNoGCRegion(1024 * 1024 * 128, true); 代码执行完了，最后的时候调用一句： GC.EndNoGCRegion(); 即可恢复 GC 行为。 除此之外，我们还能在运行时指定 GC 的模式来最大化性能： GCSettings.LatencyMode = GCLatencyMode.Batch; GCSettings.LatencyMode = GCLatencyMode.Interactive; GCSettings.LatencyMode = GCLatencyMode.LowLatency; GCSettings.LatencyMode = GCLatencyMode.NoGCRegion; GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency; 更进一步，我们甚至可以直接将堆内存中的代码执行，在 .NET 上自己造一个 JIT，直接从内存创建一块可执行的区域然后往里面塞一段代码用来将两个32位整数相加： var kernel32 = NativeLibrary.Load("kernel32.dll"); var virtualProtectEx = (delegate* unmanaged[Cdecl, SuppressGCTransition]<nint, void*, nint, int, out int, bool>)NativeLibrary.GetExport(kernel32, "VirtualProtectEx"); var processHandle = Process.GetCurrentProcess().Handle; Memory<byte> code = new byte[] { 0x8d, 0x04, 0x11, // lea rax, [rcx+rdx] 0xc3 // ret } using (var handle = code.Pin()) { virtualProtectEx(processHandle, handle.Pointer, code.Length, 0x40, out _); var f = (delegate*<int, int, int>)handle.Pointer; Console.WriteLine(f(2, 3)); // 5 } virtualProtectEx = null; NativeLibrary.Free(kernel32); 除此之外，C# 还有更多数不清的底层写法来和操作系统交互，甚至利用 C# 的编译器取消链接到自己的标准库，直接用从 0 开始造基础类型然后通过 NativeAOT 编译出完全无 GC、能够在裸机硬件上执行引导系统的 EFI 固件都是没有问题的，参考 https://github.com/MichalStrehovsky/zerosharp 另外还有 ILGPU 让你把 C# 代码直接跑在 GPU 上面，以及跑在嵌入式设备上直接操作 I2C、PWM、GPIO 等等，就不再举例子了。 而 C# 已经进了 roadmap 的后续更新内容：允许声明引用字段、添加表达固定长度内存的类型、允许传数组时消除数组分配、允许在栈上分配任何对象等等，无一不是在改进这些底层性能设施。 以上就是我认为的 C# 和 Java 最大的不同。 在 C# 中当你不需要上面这些的东西时，它们仿佛从来都不存在，允许动态类型、不断吸收各种函数式特性、还有各种语法糖加持，简洁度和灵活度甚至不输 Python，非常愉快和简单地就能编写各种代码；而一旦你需要，你可以拥有从上层到底层的几乎完全的控制能力，而这些能力将能让你有需要时无需思考各种奇怪的 workaround 就能直接榨干机器，达到 C、C++ 的性能，甚至因为有运行时 PGO 而超出 C、C++ 的性能。 扫描二维码，在手机上阅读！
当孩子问「为什么小朋友不小心碰到我，却不向我道歉」时，该怎么回答呢？
链接：https://www.zhihu.com/question/468899632/answer/2170139482 您还是没参透道歉的核心，是给自个儿消灾避祸的护身符，不是对别人的要求。 因为本质上讲，道歉它一分不值。 类似于道歉时说的“对不起”，以及其它客套话比如“劳驾”“您”“借过”"谢谢"“excuse me”……它们的作用都类似。 有的叫情绪支付，有的是情绪预付。 我在街上走，你挡在我前头了，我说劳驾您借过一下，你肯定就让开了，我也就走过去了 这就是预付，我希望你有个行为，用客气话支配你，则你心甘情愿的实施这个行为。 同样我在街上走你挡路，我说你属螃蟹的哈横在路中间，给爷爬！ 你回过头来眉毛都立起来了，这一架跑不了。 而道歉，则是滞后于自己的行为给别人造成损失，伴随发生的支付措施。 我不小心碰你一下，你疼了，我说对不起，你也就不挑事了。 其实你疼还是疼，我的道歉又不是念白魔法咒语，给你疗不了伤，只是你心情舒畅了而已。 而且，我碰你一下，也道歉了，你还是逼逼赖赖没完没了，则周围的舆论肯定是向着我的。 “人家都给你道歉了，不依不饶这是想碰瓷啊！” 对不对？所以道歉在小事上，能给自己少惹麻烦，也能争取舆论支持。 孩子要是不懂这个，你领着他去超市买根冰棍吃，问问他，刚才看见爹给你结账了吧，我不结账超市能放我走吗？ 孩子说不能。 你告诉他道歉就是结账，结小事对别人负面影响的账。 有人偏不爱结，轻则背后挨骂，重则当场挨打。 所以嘴甜，是让自个身子少受罪的办法，把客气话看成情绪上的零钱就好，你自己有这笔零钱就安心，能帮你平不少小麻烦。 别人没有它，你崩替他操这个心，而应该用悲悯的视角看待这人，因为你掐指一算，他这辈子得有大把时间浪费在跟人撕逼上，遇上比他还横的，挨揍都在意料之中。 你说这人可怜不可怜。 你还得告诉孩子，道歉对于你来说，小账可以平，大债跑不了。 你不小心把人2块钱的豆浆碰洒了，你道歉了，人家兴许不跟你计较。 反过来你一把给人小2k的飞天茅台给cei了，错非对面姓马，否则你十六国语言道歉，也逃不开赔偿。 所以儿贼，领悟道歉的精髓了么？ 道歉在大事上，死罪可免，活罪难逃，情绪能平，逃单不行。 所以面对道歉，除了看态度，也得看战损比。 比方说刚才内个小孩平衡车压你脚，你疼一下，他也说对不起了。 你低头一看，1000块钱的鞋压坏了。这时该怎么办？ 先把情绪债还上：“没关系，脚没事”。 你也客客气气。 然后再就事论事：“我这鞋上礼拜刚买的迪士尼限量版，998，您看按折旧给700合适吗，不成咱还可以商量。” 这叫一码归一码，不叫得理不让人，孔孟二位老先生在天上看着，都不会说你失了这个“礼”。 所以道歉，你就当是兜里零钱看待就对了，且只用于自己对外支付，因为道歉收到的好处都是自己揣着的。 小事你擅于道歉，逢凶化吉。 大事对方哪怕给你道歉，也得账目明细。 而小事别人不道歉，说明这人不但傻，而且穷，穷的连情绪上的零钱都掏不出来。 这零钱欠多了，自有老天催债。毕竟这世界上睚眦必报的狠人，还是有的，迟早碰上一位教他做事，他就舒坦啦。 扫描二维码，在手机上阅读！
作者：无念 链接：https://www.zhihu.com/question/483752248/answer/2127520344 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。 因为删库跑路，我坐牢了。 公司老板经营不善，拖欠工资半年，我终于忍无可忍，提出离职。 而老板居然说：爱走就走，一毛没有。滚吧！ 我气愤的直接设置了全盘删除的自动任务，明天凌晨定时执行。然后直接走了。 收拾自己的东西离开了公司。隔天老板发现这事，报了警。 老板以我的行为对公司造成了几百万损失的名义把我告上法院。 最后，我进了牢房。 狱友们问我：你怎么进来的？ 我答：我写代码写进来的。 狱友们：你牛逼啊！ 我只好惭愧的接受了赞扬。 进了监狱，其他人都是劳动改造，做些低端工作，而我作为技术人才，那就不一样了。我接着996写代码。 首先是管理监狱数据的小哥，要清点监狱人员的资料，居然用的是Excel表格。 他整理起来太累了，向领导抱怨。 领导就说：xx不是写代码的吗，让他来帮帮你。 然后我就被提了出来，替小哥整资料。整着整着觉得不对劲，我一个程序员，我凭什么手动整理资料？ 然后我就打开了Excel函数，快速写了几个方法，把所有数据分门别类的处理完毕。 就在我靠着电脑椅打哈欠的时候，小哥回来了。发现我已经完成了。 小哥惊了，大声道：这是我平常一个月的工作量，你这就完了？ 我不屑一顾的笑了笑，点头道：没错。 小哥举起了大拇指，赞道：不愧是程序员。牛逼！ 然后我以为我会被放回牢房了。 结果，领导又找上了我…… ——点赞高于五十了，加更加更。 领导：小x啊，我这边有点事情，你帮忙做一下。要是做好了呢，我可以给你申请减刑。 我略微激动，居然能减刑，当场拍胸脯：没问题，有什么事就让我来吧。 然后领导把我带到了办公室，告诉我：这系统莫名其妙就坏了，帮忙看看？ 我心里开始发毛，又不是我写的系统，让我看问题，我勒个去，我有可能看不出来啊。 但是来都来了，牛也吹了，就只能硬着头皮看下去了。 捣鼓了一会儿，大概明白了，这是个管理数据的系统。现在数据查询完全废了。报错还挺明显，就直接弹出了具体的失败原因。 看了下详细报错，我恍然大悟：这**谁干的，往纯数字的id信息里面插了中文！ 领导：那依你看，怎么修？ 我拉过键盘，迅速操作，把记录调出来，将相关的几条记录修正。然后系统恢复了顺利运行。 领导看了看，夸赞道：小x你可真厉害啊！ 我得意的笑了笑。然后越看那几行数据越眼熟。 等下，这不是我刚刚造的数据吗？那小哥整理数据就是为了导入到这个系统？ 我去，是我插的中文！写函数的时候手抖了啊！ 隐隐冒着冷汗，我昂然挺立，推翻了刚才的结论：这其实还是这系统的稳定性不够高，做系统的人没有做好防护啊。 越说越顺嘴，我大声到：要是我来做，这系统肯定不会这样崩！ 但是，心里想了想，可能是换个方式崩。 领导看了我一眼，似乎发现了我前后不一致的说辞。但是并没有再说话。 我呆了一会儿，有点虚，主动咨询领导：我现在可以回去了嘛？ 领导：可以，可以。 领导叫来小哥，把我送回去。还嘱咐着，给我换个好点的牢房。 但我心里寻思，这牢房还能有什么好的。 走出办公室前，还听领导在那边跟其他人聊什么，监狱改造，技术创收，充分发挥技术人才的价值…… 我就知道，这事儿，还没完。 等下，我的减刑呢？领导不会忘了吧！啊！！！ ——点赞超一百了，加更加更。 小哥带着我回牢房，我看着这路不对啊。 我问道：这是去哪？ 小哥答：带你去高级间。 我沉默了，还真换牢房了。原本的狱友们远离了，颇有点怀念呢。 进了新牢房，开局第一问：你咋进来的？ 我：写代码写进来的。 狱友：哦豁，牛啊！ 我：你呢？ 狱友：我也是。 我：……合着你刚才是夸自己呢。 狱友：那可不。看着狱友昂扬的头，我有些困惑。 于是我详细说道：我是被欠薪了，所以删库跑路，被告了。你呢？ 狱友：我是产品经理要我写个五彩斑斓的黑色，我把他狗头打爆了！ 我瞬间躲远了。好家伙，暴力狂。 但是多想想，我点头道：打得好！胡乱提需求的产品经理确实该打。 狱友猛的靠过来，握住我的手：同道中人啊。 我尴尬的笑着，不敢反驳。我才不是怕被打呢。 过了两天，小哥又来找我了。 小哥在门口招呼着：张工、x工，跟我来，领导有事找你们。 张工就是我狱友，而我就是x工。我们听到招呼，也就服从指挥的跟着走了。 在办公室见到了领导，领导笑呵呵的说到：小x，小张，你们来了啊。 领导接着说道：我这次找你们来，是想你们给他们做做培训，学习一下编程技术。让他们在里面能学技术，出去能融入社会。 张工瞬间不屑之色冲上脸庞，喊到：就他们那群没文化的，大字不识几个，怎么教的来！ 我沉默着，我心里赞同狱友的想法。教好学生都要教很久的内容，更何况教一群可能没基础，而且也没向学之心的人。 领导被张工怼了，脸色青一阵紫一阵，沉默良久，最后对着旁边的狱警说到：把小张架回去，这个月的晚饭减半！ 张工气的脸色一红，从旁抓起椅子，就想丢过去。 旁边狱警冲上来，摁住了张工。最后张工被架走了。 领导补了一句：不服管教，扣分！加刑期！ 我沉默着，不发一言。 领导这时，缓缓转过头来，和善的笑道：小x，你怎么看？ 我当即义正严词的回道：领导出的主意极好！教他们编程，能够做项目创收，出去也能找到工作，利于融入社会。我极力支持！ 领导：那行，后面就你负责教他们了。 我：好！ 接下来，我就多了一项任务：对着黑板教狱友们编程。 是的，只有黑板。 因为监狱配的电脑数量是有限的，就那么三四台办公电脑，满足不了广大狱友的需要。 我请小哥帮我从外面带了点编程教材，然后我把代码写在黑板上。狱友们看着黑板学编程。 我一边在黑板上写代码，一边在黑板上写输出。 狱友们都是一副看着汉奸的样子盯着我。 还好我是和张工一个牢房，不然我怀疑我会被他们在下课后暴打。 在上了三次课后，有狱友忍不住了。 在座位上举手，发言问我：x工，你说我们这样学，真的有用吗？ 我：额…… 有狱友搭腔：你这就像在问，用自己的右手能不能学会完整的调情技巧一样。 狱友们：哈哈哈！ 我尴尬了，熬到上课时间结束，落荒而逃。 回去就打了报告，想找领导谈一谈。 我心里构思好了，就说我能力还是不足，带不了这么多优秀的狱友。而且这边也没足够的电脑，无法实际操作。所以请辞。 被带到了领导办公室。 领导：哦，小x啊，你来的正好，我这边接了个项目。 我满脸震惊，刚才构思的一切都忘光了。什么鬼？我进了监狱还得继续编程？ 领导自顾自的接着说：这不，我们监狱有了你这样的人才，就得充分发挥价值。所以我找朋友问了下，拿了个商家的小项目，来试试手。 我：…… 在震惊中缓不过神。监狱真的能接项目吗？合规吗？天呐。 领导：你别这样盯着我，我们监狱是可以组织服刑人员劳动创收的。 领导仿佛看出了我的意思。 我斟酌了一下，想了想张工的情况，便严肃点头：全凭领导安排！ ——接下来是200赞加更。 （补充个相关报道，网上可查： 据凤凰网报道，2006年，讷河监狱进购了250台电脑，布置了两层电脑室。 监狱组织服刑人员打“魔兽世界”和“完美”等游戏。“他们每天打出多少游戏币是有要求的。”服刑人员需要升级挣装备卖钱，“这是监狱的创收方式”。） 然后领导就大概说了一下，要做的是个xx麻将的项目。说白了就是打麻将的APP，但是麻将的规则根据地区特色进行特殊化处理。 我听完有点疑问：那盈利点呢？是氪金给辅助工具吗？还是弹广告？ 领导自信一笑：点卡模式，一张卡五块钱，一张卡打一局麻将。 我大吃一惊，不可思议道：现在是免费游戏的时代，道具付费才是常态。点卡模式已经被淘汰了啊。 领导神秘一笑：会有人买的。你尽管做项目吧。 我一时语塞。但也不想深究，反正又不是我做推广。 于是我提出了新的请求：项目可以做，但是我需要性能比较好的电脑，以及能够连到外网，找相关资料。 领导轻松的点了点头，说道：电脑过几天就来，到时候给你在办公室隔个位置，你就在那做项目。外网，我想想办法。 果不其然，过了两天，电脑就到了。 连上网，我就先上知乎，看看网友们又整了什么新活儿。 然后就看到居然有网友提问： 程序员坐牢了会被安排去写代码吗？ 这就怒敲回答：不仅要写代码，还要996！ 不行，不能多说了，领导来问我项目进度了。 ——接下来是250赞加更。 一边写着代码，还寻思着领导刚刚来说的： 就这么个小游戏，今天做出来没问题吧？ 我：…… 我寻思领导不是业内人士，只好面露难色，想着怎么解释，不可能那么快。 领导看到了我的神色，皱起眉头，试探问道：一周？这总行了吧！ 我：…… 蛋疼感加剧。这如果有现成的案例去抄，有可能可以一周出货，但是我不能打包票。我保持沉默，皱着眉头。 领导一拍桌子：一个月！一个月我要见到项目出来，不能再多了！ 我知道领导耐心可能到头了，便只好咬牙说道：那再加一台电脑，把张工派给我，我试试。 领导眉头放宽，说道：小张可以派给你。就一个月，我一定要见到成果。 然后领导就走了。 我赶在后面喊到：领导，记得我的减刑！ 领导随意摇了摇手，表示听到了。 然后我就坐在这，想着怎么把xx麻将一个月做出来。 这肯定是996了，说不定还得007。 还要去网上搜索，有没有合适的参考项目，如果有的话，一周可能就能出货。 想着，我就下载了聊天软件，登陆了我的账号，找上了我的朋友。 我：在吗？有没有xx麻将的项目经验或者案例，我这急要！ 我朋友：咦？xx你不是进去了吗？被盗号了吧，骗子！别想骗我。 我：我在监狱入了个创收项目，要做xx麻将。现在来求你帮忙了！我不是骗子。 我朋友：你怎么证明你不是骗子？ 我：我知道你喜欢男的，够不够！ 我朋友：……你进去了还能上网，牛啊！不愧是x哥。 我朋友：听说你删库跑路，我还为你叹息，现在一看，你进去以后过得还挺好。 我朋友：不愧是牛人，到哪都过得潇洒。 我朋友：你这是打算在监狱里接着干下去了？ 我：……少哔哔，有没有资料。监狱领导给的活儿，我就等着干出点成绩来，求领导减刑了。 我朋友：我寻思在监狱里有电脑，有饭吃，可以打游戏，其实蹲里面不比外面差。 我朋友：你一直蹲里面，也没什么不好。这不，反正还能上网吹牛。 我：…… 我心里真想撕了这小子，逼逼赖赖个不停。 跟我朋友掰扯了半天，他一直劝我狱里挺好的，不用急着出去。 我烦的骂了他一顿，把话题拉回来，到底有没有资料？最后这货说他也没资料，回头帮我问问做这方面的熟人。 蛋疼的结束了对话。 然后自己上网检索。这类项目还真不少。但是源码又拿不到，还是得自己做。 暂时没什么思路，张工的电脑也没到位。我只好一边紧张的牙疼，一边上知乎摸鱼。 看到网友们的评论，笑得我合不拢嘴。 网友都是人才啊！ 随后下了几个游戏，电脑设置静音，然后打了起来。 打的痛快了，然后想起项目还没做……战战兢兢的……继续打游戏。 就这样，在紧张的摸鱼划水中，张工的电脑也配齐了。张工也给我派过来了。 然后……我们就开始在游戏中双排。 当然，中间还是有讨论一下项目的。 张工表示不难，他来搭一下总体架构。 那我就放心了，然后我们继续双排冲分。 此刻回想起我朋友的话，似乎也没什么毛病。 监狱里挺好的，网友，哦不，是狱友们个个都是人才，说话又好听，我超喜欢这里的。 到监狱里就跟到家一样。 ——接下来的是350赞加更。 打了几天游戏，不对，是做了几天项目，进度不咋地。 我开始有些头皮发麻的时候，我朋友回信了。 我朋友：x哥，在不？ 我：不在。 我朋友：前两天你让我问的项目，我问到了。 我：说说看？ 我朋友：你那个xx麻将有雷啊，表面上是点卡收费，实际上……是灰产。 我：你可闭嘴吧你，就说有没有资料。 我朋友：你不关心风险？后面加刑了怎么办？ 我：我不做项目，立马就加刑。 我朋友：…… 沉默良久，我朋友接着发了句：看来你确实在里面呆的很舒服，想接着呆里面。 我：呸呸呸！你可少哔哔，赶紧把资料给我。 经过我的一顿催促，我朋友总算把资料发给我了。 还给我絮絮叨叨说什么风险，我只回了句： 技术是无罪的。[滑稽] 翻开资料，按步骤，架设后台服务器，安装手机模拟器，打开xx麻将APP。 完美！ 就是贴图不太对，是yy地区的，我要改成xx地区。 用P图调整一下，大功告成！ 然后我和张工讲了一下这事，我们击掌相庆。 项目初步完成，继续打开游戏，双排。 当领导走进我们项目组的时候，差不多是一周左右。 那时候张工正站了起来，怒视着我，呵斥道：你怎么这么菜，刚才那波你不应该上的！你就不会先拉扯一下吗！ 我尴尬的笑着：我觉得我可以打赢。没想到我不行。 张工立刻举起了椅子，喊道：你再说一遍！ 我：不敢不敢。 领导：咳咳，你们在干嘛？ 瞅见领导来了，我的脑筋立刻转了一百八十度，回答道：我们对于项目的实现有点分歧，正在沟通。 一边说着，一边把游戏退了，切到了程序页面。 领导狐疑的看了我一眼，但是没有深究。这时候张工也把游戏界面切掉了，我们完美过关。 领导接着说道：有分歧不是问题，要好好沟通嘛。 我：是是是。 张工没说话，保持沉默。 领导：我现在过来，就是看看进度的。怎么样了？ 我不敢报太快，就是模糊说到：只是做了个初步的模型，还有待完善。 领导：能一个月完成吗？ 我想到那个完整的资料，即刻拍起了胸脯，说道：没问题，保证完成任务！ 领导：那让我看看你们做的模型吧。 我：好！ 然后我在一通手忙脚乱之后，打开了模拟器，启动xx麻将。 领导：这个xx公司是什么意思？ 我冷汗直冒，糟糕，原有xx公司的水印还没去掉。 ——接下来的是400赞加更。 然而冒冷汗并不能解决问题。 经过短暂的思考，我解释道：这是我和张工打算为了这个项目的运营成立的公司，先写上了名字。 领导：是吗？为什么我感觉好像听过这公司名字？ 我舔了舔发干的嘴唇，故作疑惑道：什么？名字已经被占了？那看来不小心重名了，这个公司名不能用了。 领导沉默了一会儿，没再纠结这个问题。 然后领导接着看项目，时不时一句这里不对，那里不对，提了一堆修改意见。 艰难的应付完，送走了领导，我和张工面面相觑。 我：接下来可真得干活了。 张工：别说了，赶紧下一把。 我：走走走！ 然后在紧张激烈的打游戏过程中，我们抽空改了改项目。 做着做着，开始了闲聊。 张工：你知道吗，减刑窗口期就在下个月了。 我：咋了？你的意思是尽快完成，争取奖励？ 张工：不，我的意思是卡住时间，不减刑绝不完成！ 我：emmmmm……可你没戏吧，你这不是要被加刑了。 张工：不会，那领导现在有求我们的地方，把柄在手还怕他不减刑？ 我奇怪的看了他一眼，赞道：不愧是张哥，牛。就看你发挥了。 又过了几天，领导果然再次来检查进度。 我们故意提供未改完的版本给领导看。 我故作艰难的说道：这个改造比较复杂，正在努力完成。 然后我使了使眼色，张工跟着开口：听说减刑窗口期要到了。这次能给我们减多少刑期？ 我领导先呵斥了我，说道：工期就一个月，必须按时完成。做不到就加班加点的干。 然后撇了一眼张工，说道：你们放心，我都安排好了。 领导似乎说了什么，又似乎什么都没说。 局面一时尴尬，集体沉默了几秒。 而后领导又抚慰道：小x，小张，你们放心，好好给我做事，我不会亏待你们的。 张工听完，脸色渐渐变红，大声喊道：你给我说清楚，什么叫不会亏待？你安排好了什么？ 在张工咆哮的时候，旁边的狱警一下子窜了上来，一个擒拿，先制服了他。 领导撇了张工一眼，脸上略显无奈。 随后领导示意狱警放开张工，劝道：你好好按时完成，我尽力申请减刑。这总行了吧？ 张工冷哼了一下，拍了拍衣服，说道：还凑合吧。 我悄悄比了个大拇指。 等领导和狱警走后，我赞道：还是张哥牛逼啊。这下子稳了！ 张工脸色慢慢恢复平静，然后说道：不能信这种人的鬼话，依然要拖工期。他求着我们，才会给我们办事，等我们完成了，没有利用价值，那就不可能了。 我一时有点诧异，但是刚刚一幕还在眼前，于是点头道：张哥靠谱，就按张哥说的办。 接下来的几天，我们接着双排，冲分。项目干脆先不写了。 游戏打着打着，我忽然想起个事。 我说道：张哥你先单排，我去写个后门程序。 张工看了我一眼，点了点头，然后继续埋头打游戏去了。 除了拖工期之外，要时刻拿捏把柄，那自然是后门程序无疑了。 首先，我先写个加密，然后设置了有效期一个月。每过一个月，必须给一个新的密令，要不然程序直接罢工。 其次，我写了罢工后的操作，对关键程序文件进行自我删除。反正我这边有完整的文件备份，删了就删了。关键就是让他们无法恢复。 最后我写了个程序罢工后的常规提示：请找系统管理员解决。 接下来，把密令和加密程序上传我的云盘，删除本地文件。万事大吉。 我跟张哥透了个气，共享一下后门程序。张哥表示不需要，他一定要在上线前解决问题，不拖到上线后。 想法不一样，不要就不要，我也乐得如此。 独掌后门程序，想让项目走下去，还得回来找我。 ——接下来的是500赞加更。 监狱里实在太无聊了！ 能见到的就那么几个人。 狱警小哥，狱友，领导，就这么些人。 天天打游戏也很烦啊。 我想出去，换换口味，吃点鸡排，汉堡，烧烤。 我想出去玩点别的，不是天天打游戏，还可以去爬山，去打球，去玩桌游。 我想看点美女，穿汉服的，穿jk的，穿洛丽塔的。不像这里面，衣服就特么清一色，还连个女的都没有！ 张工：来来来，下一把。 张工招呼了一下，不说了，继续打游戏了。 但是，我想出狱的心思愈发浓厚了。 仅仅打游戏，只是满足了低层次的需要。 我还要吃美食，看美女。 我要站在山巅，俯望大地。 然后我又操作失误，屏幕灰了。 切出去一看，我朋友又找我了。 我朋友：x哥，咋样，项目做完可以出来了吗？ 我：没呢，拖着。逼他减刑再交项目。 我朋友：666，x哥牛批！ 我愧不敢当，这不，复活了。继续冲杀。 我朋友：但是你那个项目有问题啊。这种xx麻将实际上是给别人提供网络赌博的渠道，点卡等于赌场的抽水。 我朋友：你这种间接提供网赌，被抓到就又进去了。 我朋友：x哥，人呢？你这样不行啊。 然后我屏幕又灰了。再切出游戏。 我：去去去，别乌鸦嘴。 我：技术无罪，你懂吧。这又不是我想搞的项目。 我朋友：要不，你举报吧。说不定还能拿个戴罪立功？ 我：……这，不太好吧…… 我有点意动，又有点犹豫。 ——接下来的是550赞加更。 我还没给我朋友回消息，一旁的张工先叫了起来。 张工：又要输了。你怎么就不能专心点打游戏呢！ 张工：连打游戏都不专心！ 我只好尴尬的关闭了聊天窗口。 经过一场奋战，果然还是输了。 张工握紧拳头盯着我。 我立刻认怂：我错了，是我太菜了。 领导：你们在说什么呢？ 没注意间，领导又来了，手上还拿着一叠材料。 我瞎编了几句项目遇到困难，正在讨论，糊弄了过去。 领导：来看一下，这是减刑申请书。已经给你们写好了。 我稍微翻了翻，减刑申请书包含： 1，申请人的信息。 2，犯案情节，服刑期间的积极行为。 3，说明减刑条款，就是减刑原因。 看了看我的减刑原因，态度积极，确有悔改。 看看张工的减刑原因，态度积极，确有悔改。 我偷偷看了眼张工刚刚还捏紧的拳头。真可谓： 说你没悔改，你就没悔改，有悔改也没悔改。 说你有悔改，你就有悔改，没悔改也有悔改。 看完申请书，我非常满意的点了点头。 但是张工却在一旁低声说道：申请了之后还要评审，评审了还要公示，有人提异议还要复核。这只是第一步。 领导不管我们窃窃私语，继续问项目进度。 那还用说……我们都忙着写（da）代（you）码（xi），当然没什么进度啦。 领导呵斥道：减刑申请书都给你们搞了，你这进度行吗？我下周必须要见到成果！ 领导沉默了两秒，补充道：做不完就给我加班加点的干！ 我和张工对了对眼色，张工微微摇头。 我心中有数，当即答道：我们会努力的。 我似乎说了什么，但其实我什么也没说。 领导：下周如果没完成，减刑申请书不会通过审批的。 领导呵斥完，就走了。 我和张工面面相觑。 我：要不，还是下周提交完整版？ 张工保持沉默，皱着眉头，没说话。 这一招，给个蜜枣再敲一棒子，令我和张工都踌躇了。 我犹豫了一下，说道：要不，这周少玩点游戏，推点进度意思一下？ 张工犹豫了一会儿，微微点头。 我叹息道：再这样磨洋工不合适，但是完全做完也等于主动丢弃谈判资格，所以推动一些，意思意思，只能如此了。 张工诧异的看了我一眼，赞道：说的不错。 暂时也无心游戏了，我切到聊天界面一看。 好家伙，我朋友快给我刷了99+了。 就看最后几句…… 我朋友：x哥，你还在吗？ 我朋友：你是不是被监狱领导抓到了？ 我朋友：我现在报警来得及吗？ 我朋友：呸，不是，我现在举报来得及救你吗？ 我朋友：x哥你说话啊…… 我踌躇了，我开始思考一个人生的终极问题，我朋友会不会是喜欢我？ 这不就是，我拿你当兄弟，你居然想上我？ 烦恼了挠了挠头，我还是回了消息。 我：闭上你的乌鸦嘴。 我：我刚才在打游戏。 我：刚才领导来了下。 我：给了减刑申请书。 我：暂时不考虑举报。 我：就看后面减刑顺不顺利了。 隔了会儿，我朋友回信了。 我朋友：我差点就在想报警了。 我朋友：不过想了想，你在里面，人家民警也不管啊。 我：……废话，狱警也只会一起对付我…… 这可能就是入狱的困扰了吧，警察不会保护你了。相反，警察遇到你，得抓你。 ——接下来的是650赞加更。 在紧张的写（da）代（you）码（xi）中，一周很快就过去了。 当领导来检查的时候，我们的修改，当然……并没有完成。 领导对我们拍桌子瞪眼，怎么这么久了还没完。 我赶紧解释：你看这个这个，这几个关键点，我们这一周加班加点的赶出来了。 然后我跟上一句：减刑还是需要您大大的…… 领导直接打断了我，说道：行，就这样上线吧！ 我懵逼了。我看向张工，张工也懵逼。 领导：客户等得不耐烦了，先上线。这些问题看他们反馈再考虑改不改，不反馈就不管了。 我和张工无以言对，最后我只能竖起拇指，夸道：您真是高！高明！ 领导接着发话：小张先送回去劳改，小x你负责给客户上线。 然后狱警就把张工制服带走了。 张工走前留了这么一句：小x，要注意保证质量啊。 张工强调了“质量”，我自然明白这意思。 在项目中质量和速度近乎是反义词，做得快就容易粗制滥造，赶工做出垃圾。而要提高质量，那么速度上就快不起来。所以，张工是提醒我，切记别忘了拖时间，把握好把柄。 看着领导那不屑的笑容，我想他没明白这个提醒的含义。 接下来领导给了个联系方式，让我去联系。好家伙，居然是让我上线。那我岂不是……具备了再次删库的条件。 等下，我为什么要说再？算了，先再来一把游戏吧。 ——接下来的是700赞加更。 和客户的联系人沟通之后，确认了是他们提供主机，我远程登录上去部署。 然后，我要配合他们联调测试，直到彻底确认能可以使用。 了解到这些，我立刻又写了个后门。 既然能够得到具体的部署地址，那么，我就在服务器上面留了个入口。 只要我发送特定的加密字符串到特定入口，立刻启动核心代码删除程序。 这样，主动删库和被动删库的能力就齐活了。 （被动就是指那个一个月没有更新密钥就自动删除代码的程序。） 然后就是枯燥的上线过程。 先部署数据库，然后部署服务器，然后测试网络情况。 自己先用电脑的手机模拟器下载APP，进行测试。 然后指导对方联系人用手机下载APP，进行测试。 中间略有波折，最终顺利通过。 我就基本完成了上线任务。 闲下来之后，我开始慌了。我忽然意识到了一个问题： 领导在决定上线之后，立刻拖走了张工。 那现在上线完成了，是不是也会拖走我？ 虽然我留了后门，但是也不能低估领导的凶狠啊。 我立刻把本地代码上传云端，然后对本地代码进行清空。保证我独一份的数据。张工那台我也给删干净。 然后通知我朋友：如果一个月，不对，如果两个月联系不到我，就举报领导参加灰产。 我就一边上传文件，一边写举报信。 当然是实名举报，举报人是谁？是我自己。 这多劲爆啊，狱里的犯人还能举报狱里的领导。 匆匆忙忙，传完文件，本地清空也搞定。然后举报信发给了我朋友。 好了，我安心了，继续打游戏。 我正要开下一把，领导倒是没来，但是狱警来了。 我：额……有什么事吗？ 狱警：领导说项目结束了，从哪来回哪去。 狱警颠了颠警棍，问道：你自己走，还是我带你走？ 我：……我自己走，我自己走。 在狱警的监督下，我回到了和张工一起的牢房。 张工诧异的发问：你怎么回来了？ 张工下一秒醒悟：你怎么没拖住呢！ 我当场尴尬，回道：这也不是写代码，只是部署个项目，一不小心就全弄完了。 张工气的抬起了手，犹豫了一会儿，又放下。 张工叹息：唉，这下子完蛋了。给这老小子得意了。 我尴尬的不知道说什么。但是觉得沉默也不好。 于是我顺着张工的话头说道：是啊，这下子完蛋了。 但是我想了想，又回过味来。之前就是坐牢，现在还是坐牢，有什么区别呢？ 可能区别就是不能打游戏了吧。 于是我和张工一起，原地坐牢。 我：好无聊哦，现在没有游戏可以玩了。 张工：何止，刑期还变长了。 我：有吗？没变长吧。 张工：本来可以减刑，现在有可能减不了，那就是变长了。 我：……似乎很有道理的样子。 然后我们继续参加劳改。 大体内容就是，简单重复的工作，钉扣子和绣花等等。 熬了两三天，从难熬到逐渐习惯。 我和张工都开始麻木了。 这时候年轻的狱警小哥找来了。 小哥：领导正找你呢，赶紧跟我来。 我懵逼：我这儿活还没干完…… 小哥：别干了别干了，你程序出bug了。领导喊你回去项目组修bug呢。 我缓缓回过神来，问道：出bug了？ 小哥：是啊。 我猛地意识到，我可以回去了。 我笑了起来：哈哈哈，我的程序出bug了，出bug了啊！ 强烈的喜悦冲刷着我的内心。 意料之外，而又情理之中，代码出bug了。 往常的我，出bug愤怒至极；而这次的我，出bug特别开心！ ——接下来是800赞加更。 然后我就被狱警小哥送回去了。 我那个开心啊，又能回去打游戏了，又能跟网友们吹牛了。 乐颠颠地走着。 直到我坐在电脑面前，我才开始思索。为什么出bug了？ 我明明是拿了个现成的项目改的，凭什么出bug啊？ 难道又是历史的代码，屎山带来的问题？ 想着想着开始头大了，我就想先打把游戏解解压。 刚刚打开游戏界面，我就瞧见领导正走进来。 我赶紧把游戏关了，切到代码界面，假装在看问题。 领导：小x啊，你怎么回事，项目出bug了，赶紧看看吧。 我：在看呢在看呢。 一边假装严阵以待，一边想着等会儿游戏用什么英雄。 领导：什么时候能查出来啊？ 我灵机一动，答道：这个，我也没把握啊，可能是张工写的部分有问题。需要张工帮忙看看。 领导陷入了深思。 我感觉我真特么贼机灵，赶紧借着这个机会，把张工拉回来，正面肛领导。 领导沉默了一会儿，脸都黑了，最后用手一拍桌子，说道：我把小张给你派来，但是你今天必须查出来问题是什么。 然后领导威胁道：不然的话，不仅不能减刑，晚饭也别吃了！ 我立即点头：好。 然后领导走了。 得了，这游戏看来暂时不能玩了。 我得研究研究，到底是为啥啊？ 我远程登陆了服务器，然后通过工具，获取了服务器上面的报错内容。 报错内容挺简单的，内存溢出了。 就是内存不足，项目需要的内存超过了分配的内存。 这真是个经典错误，然后我开始探究是不是服务器太垃圾了，或者配置有问题，内存不够用？一看，好家伙，服务器没问题，内存给的很大，应该不是这方面的问题。 然后我换了工具，尝试提取了内存分布情况。就是看看到底什么占了大部分内存。 这时候张工就来了。 我：张哥，你可算来了。兄弟我够义气吧？见到机会，就把你拉回来了。 张工：小x不错啊，好兄弟！ 张工赞了我一句，然后问我，是什么情况，为什么能把他拉回来？ 我就开始介绍，大概出了什么问题，我跟踪到了哪里。还提了领导威胁的话。 然后我们初步达成了共识，先把问题查出来，然后以此为理由，跟领导讨价还价。 接下来，我就打开了内存分布的日志，好家伙，内存里占满的是基本类型。 这种基本类型到处都在用，根本看不出问题。 我和张工相互对视，两脸懵逼。 然后，我们讨论了一下，原有项目没这个问题，所以我们一起检查修改的代码部分，尽快找出问题。 ——接下来是850赞加更。 查了一阵子，张工大叫一声，找到了。 我赶忙跟过去看，是哪里出了问题。 张工：就是这个函数，没有释放内存资源。 我：这一块啊……我记得我专门优化过这一系列的内存释放啊。 我：之前这一块乱七八糟的，用一下释放一下，没有规律。代码跟屎一样。 我：当时我看到了，就把内存释放合并到特定模块。优化结构，挺高可阅读性和可用性。 张工指着屏幕上的特定部分，说道：你的优化我看到了，思路不错。但是，这一块没有引用到你的释放模块。 我：…… 核对一下代码，是的，几个优化的模块都有引用到了，但是这一个，没有。 我再看了一遍，是的。唯独这个，它没有就是没有。 我：这，咋说……哎，它怎么就没引用到呢。 张工：所以说，就是改的时候漏了。 张工：哎，你不知道程序员界的那句谚语吗？就是“bug能跑，就别改。”懂？ 我寻思这是哪儿来的谚语，说道：可这也不是bug，就是设计混乱，代码稀烂。我才做的优化。 张工：一样。这种写的烂的，不管他再烂，只要能跑，就别改！你改了一个bug，就可能因此衍生出一千个bug。 我无奈点头，答道：是是是，明白了。bug只要能跑，就别动它。 接下来我们讨论了一下，有两个方案： 1，直接恢复原始代码，恢复这个模块的逻辑； 2，检索所有涉及部分，都改成新的，确认无遗漏。 讨论了一下，还是新的更合理。优化是有必要的。 我们采用方案2，全部改成新的。 于是我进行了全局检索，确保全部修改到位。 改完了。接下来？当然是来一把游戏啊！ 打了两把游戏之后，领导来催了。 领导：小x啊，问题找到了吗？ 我：找到了找到了。 领导：是为什么？ 我：这个，程序在我们电脑上都是好好的，我查了下，是服务器的问题。 领导有点担忧的问道：那怎么弄一下，修复一下？是不是要换服务器？ 我：不用不用。我调整一下程序和服务器的配置，兼容一下就好了。 领导脸色欣慰，说道：那赶紧弄一下吧。 （说句闲话。这个bug是真的出现过的，我们这边来了个新人，把c的内存释放的部分优化了一下……然后就出现了严重的生产事故。） 领导让我赶紧修复，而我却闭上了嘴。 这时，张工面无表情的看着墙壁说道：我们的减刑，安排的怎么样了？ 领导皱起了眉头。 场面一时间沉默了。 不知过了多久，领导神情平缓了，说道：现在修复吧，我会为你们争取减刑的。放心，亏待不了你们。 张工看向了我，微微点头。 我心里有了底，然后手指如飞的操作起来。 其实也没什么内容，就是编译一个新版本，然后丢上去覆盖，重启，完事了。 看着项目启动完成的提示出来，我就对领导说，启动好了，可以试试了。 随后领导播了个电话，确认了运行正常。 这次紧急bug就到这里了。 接下来，我们不需要回去劳改了，因为领导终于意识到了项目可能出问题。 所以，我们转成项目的维护工程师了，接下来就是在这边维护项目。顺便把几个可能要做的修改点，先做一下。 领导走前还强调了，会给我们“加薪”。 劳动改造产生经济效益，会给犯人发点补贴，就是零花钱。 一个月，少的40或者60元，多的100元，可以买点烟抽一下，或者买点榨菜改善一下伙食。 而我们从事技术类工作，领导许诺，会给我们一个月发300元。能多买好几包榨菜呢。 然后，接下来我们就放心的继续打游戏了。 过了几天，减刑的审查结束了，开始公示减刑名单。 张工果然在减刑名单上面，稳得很。 我看到名单就夸张工：张哥稳啊！稳得一批！ 但是，减刑名单上没有我的名字。 我翻来覆去的看了好几遍，确实，真的没有我的名字。 ——接下来是950赞加更。 我：我要见领导！我要见你们领导！ 狱警：领导说了，他不在。 狱警：……就是领导不在，现在见不了你。 我：那你告诉他，不来的话，我现在就删库。 狱警：删库？啥意思？ 我：就是让项目死掉的意思。你转告领导吧。 然后狱警就走了。 隔了没一会儿，领导来了。 领导：哎，我说小x啊，别激动嘛。我不会亏待你的。 我：…… 无语了一阵子，我直接问领导：为什么减刑名单上面没有我？ 领导：我可是给你换了高级牢房呢，我不会亏待你的。 我再问领导：为什么减刑名单上面没有我？ 领导：我给你提供了优越的办公条件，你们是少有的能够碰电脑的犯人啊，别不知足。 我三问领导：为什么减刑名单上面没有我？ 领导：你看，别的犯人一个月才几十块，我现在可是给你开了300块工资呢。 我快要疯了，嘶吼着问道：你xx的，到底为什么减刑名单上面没有我！ 领导脸也黑了，沉默良久，吐出了四个字：下次一定！ ——接下来是1000赞加更。 随后领导安抚了我，说了一套什么我审查资格不达标，所以没通过的话。 我持怀疑态度，没说话。 然后，领导强调下次会再为我申请。 我没说话，但也没办法。 随后领导离开了。我只能叹息，等待。 审查资格不达标什么的，我是不信的。毕竟张工的减刑原因可是“态度积极，确有悔改”，这他都能通过，我凭什么不能通过？ 但是胳膊掰不过大腿，领导说你不达标，那你就是不达标。 我等这个“下次一定”，着实等了好久。 接下来，我和张工继续一起打了一段时间游戏。 张工在减刑后刑期缩短，不久后申请了假释，他就出狱了。 然后我就失去了双排的小伙伴，开始了孤独的单排之旅。 中间我朋友有找我聊天。 我朋友：x哥近来可好？ 我：不好，差极了。 我朋友：咋了，监狱里过的不是美滋滋吗？ 我朋友：上次还以为你要出事，结果也没多久又跟我说没事了。 我：刑期变长了，能好吗。 我朋友：啥？刑期还能变长？你是在里面斗殴了？ 我就跟我朋友解释了一下整个事情，我本来好好地能减刑的，结果减刑飞了。 我：减刑没减成，可不就是变长了嘛。 我：另个一起的狱友可是减刑成功了，他都假释出狱了。 我朋友：……真惨啊。但，也有可能就是你的狱友够狠，才成功的。 我朋友：而你太好拿捏了，就被剩下了。 我朋友：有些东西只能自己去争取，而不能假手于人。 我：是是是，你说的都对。 我微微叹息，事已至此，徒呼奈何。 过不久，领导又来找我了。 领导：小x啊，我这边又接了个项目。 我：这个，是什么项目？ 领导给我讲了讲，我越听越耳熟。 我：等下，这不就是我入狱前做的项目？ 领导微微点头：没错，就是它。 我瞬间开始蛋疼，脸上不知什么表情是好，应该是一抽一抽的。 有了上次的教训，我也不迂回了，直接问道：那我做了的话，有什么好处，给我几十万？帮我减刑假释？ 领导神秘一笑，然后大手一挥，大气的说道：做成的话，工资再给你加两百！ 我气得开始笑：哈哈哈。 蛋疼的抽抽，笑了会儿也就罢了。 我慢慢回过气，说道：这项目可是据说价值几百万，还把我送进来了。你确定，只是给我加两百？ 领导低沉的说道：也是，听说这个项目必须靠你。那，再加两百！不能再多了！ 我摇了摇头，直接不理领导了。 狱里拿个千八百有什么用，多吃几包榨菜吗？ 出去了之后，以我的能力每个月至少一万以上的，在这里面加薪，有什么用呢。 领导劝了几句，发现我完全不理它。 然后咬牙切齿的走了，说着，以后有你好看的。类似这种威胁的话，然后往外走。 我完全没听进去，还能咋滴啊。我的情况难道还能更差。 等下，我下次减刑咋办？领导可是承诺了“下次一定”的。 于是我喊住了领导：等下！ 领导立刻转怒为喜，说道：怎么，改主意了？我说嘛，就没有加两百搞定不了的，不行就再加两百！ 我开始怀疑自己是不是做错了，我应该继续保持沉默。 领导：咋了，又不说话了？ 我缓了缓神，慢慢的说道：这项目，我做了，能立刻减刑吗？ 领导：这当然不可能…… 领导看我就要变脸了，转而说道：不可能不行。 ——接下来是1100赞加更。 讨价还价了一番，大概是要求我把删库的数据完整恢复，并且再做一些相关的改造调整。 领导给出的价码是：“尽快”帮我申请减刑。 那我的回应自然是：“尽快”完成工作。 商量完之后，领导走了。 我接着打游戏。 打了一天游戏，回到牢房，躺着。 有点无聊啊。张工走了，单排着实没劲。 闲的开始数绵羊。 然后狱警小哥带个人来了。 狱警小哥：这位是x工。这位是陈工。 狱警小哥：领导安排陈工过来，后续协助你开发项目。 我无可无不可的点了点头。 随后狱警小哥完成了引导，就走人了。 陈工立刻贴了上来，媚笑着说道：x哥，你好！叫我小陈就行。 我随意的点点头，问道：你咋进来的？ 陈工略带不好意思的笑了笑：就是急用钱，顺手从公司账上划了点。 我大吃一惊，说道：你是黑了公司财务系统，还是盗了账号？ 陈工保持不好意思的笑容，说道：修改了公司的收款路径，转到了我的账户上。不小心搞多了，被发现了。 我：搞多了是多少？ 陈工：也就几百万吧。 我寻思这也太明显了，公司一段时间内流水变少，肯定是会探究的。这人略蠢啊，被抓的不冤枉。 陈工看我不说话了，就问我：x哥，你是怎么进来的？ 我就把我的苦逼故事复述了一遍。 隔天，我去项目组继续打游戏，陈工就也跟过来了。 我约陈工双排，陈工没答应。 陈工说：监狱里是难得的清净时光，要好好的修炼，出去才能赚大钱。 得了，人各有志，各玩各的吧。 玩着玩着，领导又来催进度了。 领导刚刚进门，陈工就站了起来，迎到门口。 陈工媚笑着说道：哎哟，领导来了，真是蓬荜生辉啊！ ——接下来是1150赞加更。 在迎接领导的同时，陈工朝我使眼色，让我快点关闭游戏。 虽然陈工的姿态我有点不爽，但，也是给我打掩护，对吧。 我马马虎虎关闭了游戏，看着电脑屏幕开始思考人生。 领导：小陈啊，在这里感觉如何啊。 陈工：太舒服了，没想到监狱里能有这么好的条件。我简直想在这里永远住下去。 领导微微点头，随口说着：不错，不错。 然后领导过来问我：小x，进度怎么样了？ 我表示：工作比较困难，正在努力推进。 领导皱了皱眉。随后若有所指的说了句：小陈你要好好学啊，x工回头减刑出狱了，项目就靠你扛大梁了。 陈工点头如捣蒜：是是是，一定努力学习。 随后领导走了。 陈工找我要项目源代码，用于他学习。 我有点不想给，这独占的源码放出去，可能就收不回来了。 但是，不给的话，他跟领导告一状，那我怎么办？现在又没和领导撕破脸，减刑还要仰仗领导。 最后考虑到，毕竟是狱友，在减刑这块，我们是统一战线的。还是给吧。 于是，我把之前领导给我和张工减刑的故事，跟他说了一遍。告诉他，要长教训，拿住把柄。 陈工赞同道：x哥说得对！确实是这样。 我看他应该明白了，然后把源码也就共享给他了。 隔天领导就又来了，检视了一下。 领导问我进度，我的回应和昨天一样。反正我都在打游戏，怎么可能有进度。 然后领导问陈工，项目熟悉的怎么样？ 陈工就拿出了好几个我一直拖着没改的功能。陈工居然全都做完了。 我当场惊呆，这陈工，咋这样？ 一来是做得快，不愧是不打游戏的人；二来是怎么没拖呢，昨天的话都白讲了啊！ 领导大大的夸赞了陈工。随后就提出了给陈工加薪。 陈工千恩万谢的说着：感谢领导栽培，领导恩重如山，领导就是再生父母！ 我在一旁冷眼旁观，感觉事情不太对劲。 看来我要早做打算了。 我打开了聊天框，我朋友的头像暗着。 我：我可能要出事了。 我：如果连续两天联系不上我，就把举报材料帮我发出去吧。 我：鱼死网破而已，我不惧！ 随后在服务器上设置了自动任务，48小时后自动开始批量删除文件。 只要我连续两天无法接触电脑，就直接炸了吧。 这自动任务之前就写过，现在基本上就是复制黏贴，轻车熟路。 领导和陈工一顿亲切交流。这时才结束。 然后领导看我的眼神就变了。 领导似笑非笑的说道：x工，你可真能拖啊。 我一边退出软件，一边删除文件，随意的应道：不敢拖延，只是陈工能力比我强罢了。 领导点了点头：x工说的，有几分道理。 随后领导侧头斜着眼睛看过来：那么，x工就回去劳改吧。 而后领导拍了拍陈工的肩膀，说道：小陈，好好干，我不会亏待你的。 而后领导打了个手势，旁边的狱警冲上来，制服了我。 这一幕可真嘲讽，想当初被按住的可是另一位呢。 我挣了一下，挣不脱。也就放弃了挣扎。 我走前，大喊道：过河拆桥，不得好死！ ——接下来是1250赞加更。 随后我度过了战战兢兢的两天。 中间陈工有和我一起吃饭，我沉默了许久，还是忍不住问了一嘴。 我看似不在乎的说道：小陈，你害我，又有什么好处呢？ 陈工先是一脸迷茫，而后恍然，说道：我没想这样啊，我只是努力展现价值，希望得到认可与奖励。 陈工随后一脸歉意的说道：非常不好意思，我没想到我这样，会导致你被叉出去。 我微微叹息，也不知道该如何说话。原来，有些人只是在努力，他根本不知道他的努力把你卷死了。 随后我不再说话，静静吃饭。 但是，陈工却是打开了话匣子。 陈工左右看了看，压低声音对我说：其实我也没指望这领导能给我多少好处，这领导一看就是个抠门精，只会画饼，不干实事。 我诧异的看了陈工一眼，这小伙子似乎挺清醒的。 我：那你还…… 陈工继续压低音量说道：我已经把我的收款账户插进项目里了。 陈工说到这里，就阴恻恻的笑了笑。而我，哈哈哈，笑声没收住，赶紧捂住嘴。 接下来，饭都感觉更香了。 不过我的处境也没什么本质变化，过一会儿也就恢复了平静。 熬到两天后，我静静的待着。我心里想着，系统该炸了。估摸着是这个时间了。 又过了小半天，领导果然来了。 领导倒提着警棍，他来了，他来了。 但是脸色和我预料的不同，领导居然一点也不愤怒。 领导讽刺的笑着：好小子，居然在项目里埋雷。 我微微皱眉，应道：不敢，可能是系统出bug了，是不是需要我去看看？ 领导摇了摇头，说道：不用了，小陈修好了。 我恍然大悟，却不知该哭还是该笑。 该哭的是，陈工居然能解决我删库的定时程序；该笑的是，项目的钱已经不再属于你了，而你毫不知情。 看我不接话，也不绝望，领导不满意了。 领导皱着眉说：虽然你没给我造成很大的损失，但是，我不教训你一顿，我心里不痛快！ 领导指使手下控制住了我，随后给我一顿乱抽。 给我抽断了几根骨头，躺在地上只能喘息，痛到无法动弹。 ——接下来是1300赞加更。 不知时间过了多久，检察院的人来了。 指着我说了些什么，开设网络赌场，殴打犯人，之类的罪行。 然后，我松了一口气，就昏了过去。 我再次醒来时，人已经在医院了。 后来，和朋友聊了聊才知道，我朋友把我的举报信发给了检察院，纪委，市长热线，等举报渠道，并且通过记者朋友进行了宣传，煽动舆论。 举报了领导非法经营灰产，利用xx麻将APP开设网络赌场，肆意殴打犯人，等几个罪行。 然后，我提供的材料就是证据，我本人也成了证据。 我还问我朋友：你怎么知道殴打犯人？我没写这个啊。 我朋友：我猜的。你都失联了，大概率会挨打，随便写上的。 我：…… 过了一段时间，慢慢的知道。 领导因为开设赌场等罪，也进去了，不过这类人的关押的监狱不一样，换了个监狱， 而我也因为举报有功，符合了重大立功表现的条例，成功得到了减刑。 而后许久听说，陈工又加刑了，也不知是真是假。 好了好了，不说了，医院的领导叫我帮他们看看系统问题了。 （全文结束） （转载类似新闻： 2020年11月17日 来源：南海网 新海南客户端、南海网、南国都市报11月17日消息(记者 王天宇)随着网络的普及，一些不法分子动起了利用网络赌博非法牟利的歪脑筋。海南省琼海市嘉积镇的黄某某就是其中之一，他利用网上打麻将软件，开设赌场聚众赌博，两年多内赚取利润20万余元，参赌人员达到180人，总流水金额达到541万余元。11月17日，记者从海口市秀英区人民检察院获悉，上述案件经检察院提起公诉，黄某某因犯开设赌场罪被判处有期徒刑三年，缓刑四年，并处罚金一万二千元。） ——写完了，没了，出狱了。 ——xx麻将非法，属于开设赌场，搞了要入狱；玩xx麻将属于赌博，建议别玩，免得入狱。 ——后续最多加点人物的后续情况。不过我感觉整体很完整了，不加似乎也没什么。over。 扫描二维码，在手机上阅读！
1，打开windows的命令窗口，输入 netsh wlan show profiles,如下图，这个命令仅仅只是查看一下电脑保存的所有的wifi名字 2，需要查看密码的话，则需要输入这个命令， netsh wlan show profile name=”需要查询的密码的wifi名字” key=clear,这样子就会在关键内容那边显示密码了 扫描二维码，在手机上阅读！