1. 初识编程
清楚的记得2008年上大学,当时学的第一门编程语言是汇编语言,第一堂课上,老师就说这个学科的挂科率是最高的,大家做好心理准备,后来证明,这并不是下马威,因为真的有很多同学挂在了汇编上面。
由于觉得汇编的交互性不好,所以后来学习 visual c++ 课程的时候,异常喜欢,虽然也选修了java编程,但是只介绍了简单的语法,现在只记得那个老师年轻帅气了,哈哈哈哈。因为觉得 c++ 的指针、链表都蛮有意思的,就在课余时间对 c++ 侧重进行了学习和了解,当时 c++ 的书是学院编写的,后来我还去找了谭浩强老师的《c++程序设计》来学习,再后来还学了MFC,不记得是选修还是必修了,虽然界面不好看,但好歹是图形化的界面。
基础课程里让我印象深刻的学科有:计算机导论、算法设计、数据结构、数据库、密码学,这些课程学习对于编程这件事情上还是有很大的指导意义的。
毕业设计的时候,选了基于JPEG的图像压缩算法实现的课题,也是用c++编写的,记忆犹新的是当时做完压缩算法后,不知道如何将霍夫曼编码后的数据存储为图像,然后在图书馆泡了一周,翻了很多书籍,然后有天睡觉在梦里突然的灵光一闪,第二天起床依旧思路清晰,于是在宿舍花了1个小时就把这个功能完成了,成就感简直爆棚。
2. 求职回忆
依稀记得大三上学期,我跑去参加了学校的大四毕业生的校园招聘会,看了很多的招聘的岗位要求,对于 c/c++ 的岗位要求进行了了解,还在小本本上做了记录,顺便还找了几个用人单位的技术做了简单的沟通,提前接受了打击,想着早点知道自己的不足,总归好过真正找工作的时候发现问题吧,那次本不属于我的招聘会,给我留下了深刻的影响,也让我提前积攒了一些经验。
后来基本上找的都是 c++ 研发岗的职位,参加了南京的华为、烽火科技、润和、中电二十八所、国电南瑞,杭州的浙大中控,上海的宇信易诚等公司的招聘会和面试,由于中电二十八所主要是java岗,虽然对研究所有不错的印象但综合考虑还是放弃了这个offer,还因为地域的原因放弃了一些其他的offer,最终决定和同学一起去了杭州的浙大中控 c++ 开发岗,现在想起来,当时我们学校去杭州的人还蛮多的,大部分是去的海康,现在的海康发展也越来越好了。
3. 编码趣事
还记得毕业工作的第一年还是用MFC对工业软件进行新功能的开发和维护,现在估计听说过 MFC 的程序员都不多了,那时候为了提高技术能力,翻遍了侯捷写/译的一系列书籍,由于书籍太贵,还和同事一起买了“便宜”的影印版《STL模板源编程》等,最多的时候1个月能刷3-4本书,当然不包括像《C++ Primary》这类的工具书,另外吐槽下当时我觉得这本书,根本就不Primary,后面的1/3看起来太吃力了,工作初期基本上是啃不动的。
当时我们有个同期入职对MFC很熟悉的同事,我在遇到问题的时候,会问他,后来我领导发现后,找我进行了谈话,遇到问题要多尝试自己解决问题,最好是网上查资料、读源码、多Debug,后来我也按领导的指导,更加独立的进行了代码开发,也是我影响非常深刻的事情,后面证明,面对问题多思考和独立解决,是提高自己能力的最快速有效的途径。
对于第一家工作的公司,还是有着非常独特的感情的,还有个印象深刻的事情是进行代码评审,对list进行for循环的下标访问,根据同事的建议,调整成了使用迭代器进行访问,同时还对编码规范进行了沟通,及时发现问题和修复问题,养成了良好的编码习惯。
工作的前三年,一直是全职做 c++ 的开发,也算是做了不少的积累。
后来换工作去了惠普,面试的时候问了tcp/ip、sql等技术,也问了 c++ 的技术,面试官知道我写过MFC后,感叹会MFC的人已经不多了,我也感叹MFC写起来,有时候真的是会心累,再后来入职后,哦豁,基本是写java,万变不离其宗,多学习学习,继续码代码吧,在惠普的2年里一直在重庆PM带的一个项目里面,除了项目开发外,还会组织技术分享,提高大家对技术的热情。
在项目开发的过程中有个非常有趣的事情,当时根据需求,需要对一个 c++ 模块进行功能调整,由于我写过 c++ ,所以PM安排我来做这件事情,将原来每分钟调用频次100内的模块,根据调整的需求,同时调用频次从每分钟100提高到了每秒钟1000次不止,想着原来的代码应该没有太大的问题,就按需求在原来的基础上进行了开发,在测试的时候,发现连续运行24h后有内存泄漏的现象,于是我就开始进行问题排查,我将所有的手动new和delete的地方都进行检查,没有发现问题,由于是一个工业软件的一个插件模块,差不多代码量在2w行以上,所以我将模块里面核心实现的几个部分都拆解出来,感觉时间不够用,所以我就申请在家办公,花了3天,每天肝到凌晨四五点,后来使用valgrind内存泄漏检测工具,发现以前的代码在调用正则表达式的三方库以后,没有进行释放,从而导致了内存泄漏,当然,后来我去看了三方库的源码,觉得也不能完全怪之前写代码的同事,因为用来释放内存的函数命名也不明显,让使用的人认为调用了clean就算结束,其实不然。
下面附上一张当时加班拍的照片,看背影都能感受到头发有多凌乱,让人更加悲伤的事情是,现在的头发,已经没有了以前的浓密,写到这个地方,作者留下了心酸的泪水。
后来去了做人工智能的公司,主要技术栈是java/python/vue,进去的第一反应是我大 c++ 竟然不配拥有姓名,虽然最开始用 c++ 写了一个机器人的调度模块,后来用的机会也少了,根据我们CTO的指点,去学习了python数据分析、搜索引擎等技术,阅读了不少的书籍,除了带项目外,自己也写一些模块,这两年,每年都有一小部分产品开发中需要用到 c/c++ ,去年基于freeswitch做了mod_asr的开发,今年基于mrcp框架集成了一个mrcp server,还在源码的基础上,写了个测试工具,对 c++ 真的是又爱又恨,比起java/python/golang写起来实在是太耗时了,很多功能都要自己去实现,好处是灵活性强,坏处是花的时间多,且稳定性非常依赖程序员的个人能力。
4. 永远在路上
现在回想,也许正是因为经常在工作使用 c/c++ ,通过面向对象编程的思想,在面对问题和分析问题的时候,帮助我进行了更加细致和全面的思考吧。
当然,平时在工作中秉承着,用最合适的工具去做最合适的事情,编程语言只是一种工具,如果你手上只有锤子,那么看哪里都是钉子,千遍一律的去敲,多掌握一些技术并不是坏事,大家都知道,想要把事情做好,工具越齐全,在多数情况下,能事半功倍。
当然,每个人的精力都是有限的,个人觉得比较好的做法是先精通一门语言,一般在前3年的成长比较快,然后在掌握了自己主要的这门语言后,再去学习几门其他语言,这样面对事情会更加的得心应手。当然,从励志成为程序员的那一刻开始,就可以多看看设计模式相关的书籍,能够帮助我们进行更好的设计。
说了这么多的经历,个人觉得支撑我到现在,一直持续学习的,如果一定要只归功于一样东西的话,那就是热情吧,因为有热情,所有的付出都是喜悦,就算Debug到凌晨的过程是艰辛的,但是最后的结果也一定还是喜悦。
虽然现在也学习了管理相关的知识,觉得也挺有意思的,但是对于技术的热爱,应该是永远的不会消退的。就让处于信息时代的我们,一起创造出一个更好的互联网科技时代吧。