21CTO社区导读:三人行有我师,编程是似一份苦逼的工作,只有志在斯长于斯的人才会全程充满乐趣。
我做过好几个单人项目,读书时做过,后来自己开公司,前面一年多都是我一个人,白天忽悠客户,晚上写代码。
代码写的很快,基本不用考虑还要给别人看的问题,自己的代码我自己读的很快,一个射频卡驱动加应用层逻辑lib,我可能两三天就撸完了可能,刷一个界面展示下数据一个下午搞定。有一个文件系统比较复杂,我又不会写,开始是这里抄一点那里抄一点,然后做profiling,折腾了三个多月,我以前没写过文件系统所以比较慢。
会不会遇到隐藏很深的bug?不会,这个主要靠隔离功能的本事和随时打log,实在不行大片dump内存,写过内核的应该很清楚一般我们都很少单步的,printk do everything,我只在第一个工作的公司用过单步。如果panic了或者oop,通过backtrace或者内存dump,大概迅速定位到哪个文件,否则就是你的代码可追溯性不好啦。有很少的时候也会把栈踩坏,我基本没有犯过这种错误,这样的情况一般把内存dump出来一个字节一个字节对了,然后脑袋里把operations放一遍想想哪里踩了,或者在不同point dump下内存,一般很快对出来。我从没把一个bug搞几天搞不定的状况,可能因为我的项目复杂度不行,也可能我隔离做得好。
因为可能有好多寄存器我没用,我留空了代码,后来坑自己这tmd是啥,还要回去翻芯片手册。后来我再留空这种就直接把芯片手册页码写上。
我有半夜写代码,就是别人都走了,我一个人在那,一般一包芙蓉王可以撑到8点钟,然后去公司下的酒店洗个澡睡觉。睡到12点再回公司。我是医学院出来的,我知道抽烟不好,但是那些日子不抽烟真的写不下去,因为睡觉太少了,后来我戒了。半夜安静,效率会很高,我半夜时神经系统特别兴奋,可能跟抽烟有关当我遇到问题时,我能把写完把所有operation和内存变化都像放电影一样放一遍,我白天就没有这样的本事。
后来我们公司有好多人了,他们要用我的代码,新人看我的代码,一脸嫌弃。我花了一个多礼拜,把我一年多写的代码变得可以看了。然后我又让新来的重构,他总是重构出bug,因为我也不写单元测试的,大概他不会像我一样在脑袋里回放内存的变化,也可能是我的代码太难重构。然后我就让他回退到以前了,他写的项目就直接调用好了。后来我觉得有十几万行部分代码还是蛮重要的,我就又半夜一边抽芙蓉王一边重构了一遍,抽象出一些普适性好点的框架,那时候我花了好多时间研究qt的source,qt的一些技术思路还是很屌的。我后来那次重构是很成功的,后来公司那个领域的代码基本都是复用那部分代码。我后来有写了几个framework,至少别人没骂我,可能因为我是老大不好意思当面骂。嗯,作出很舒服的抽象其实还是蛮不容易的。
后面真的就是管理别人的代码,review别人的代码,我觉得我review的本事还是不错的,我基本用眼能瞄出新人写的大部分bug,协作的问题还真是,我开始不擅长的东西,我看了很多模式和软件工程的东西,这个真是我的弱项,我以前工作单位用敏捷,可是我是极度嫌弃敏捷的,后来我们慢慢探索出了一条自己的快速交付软件的办法,接口设计还是需要啃几本书的,其实如果我在大厂可能也不会思考这些东西,因为撕逼开会能搞定,有人罩你。因为在这边,也许下面的人有人比我聪明,但是太多时候,我就是天花板,如果我很操蛋,可能要么好人走了,要么就是越来越渣,好在我们没有越来越渣也没有因为技术模式太差出现大规模离职,我觉得大概几个项目对我影响很大,linux,因为读的Linux代码太多了不由自主会受到上面设计策略的影响,说实话linux代码整个设计一般。
netbsd,我觉得这个是工程典范。每次新人入职我都会push他去读netbsd的代码,我自己也愿意帮助他们走读几个模块,STL,sgi 的代码刷过一遍,qt ,我在不知道怎么抽象的时候不断去临摩qt咋办的。还有莱昂氏的代码,bsd上的协议栈。这些代码都不是很大,所以很多真可以当文献读。soloris/Illumos可能也很优质,我是看Gregg那本书时知道soloris上其实有很多很有用的工具,比如鼎鼎大名的dtrace。
我常常觉得自己也是一个没有受过正规训练的人,所以特别怕耽误下面的人,所以我们不做项目的时候都在翻来覆去操这几个项目的代码,讨论别人是怎么解偶的,怎么划分文件和模块的,怎么抽象的,把代码当文献是我们这样的草帮保持不落后的办法,那时候我们也会花钱请别人来讲,一般讲的都很操蛋,后来就不请了,因为有时候传说的大佬,大公司的老司机只是环境依附者,离开他们公司的工具和环境,就变得无所适从,也有讲的很好的,我们花了20万请人,大概只有一两万是值得的。
来源:网络
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/257611.html