回复《编程之路的困惑》


前两天有位新晋程序猿网友“被遗忘的角落”(494932623@qq.com)来信,希望我能帮帮他,给你提供一个大概的规划、思路。以前也有很多网友给我来过许多这样那样的mail,但由于实在没时间,更因为懒,所以甚少回信。恰前阵子由于各种关系,我也希望自己日后能开始做一些更加有意义的情况(包括准备着手做一个开源项目),所以,今天晚上我就以我这些年来的经验,对他目前的状况作了一点回复。

以下是他的mail:

今日下午在公司搜索QDbus时,进入了阁下的站点,很幸运。认真的看了您的几编文章,我的感觉是很实际。

先自我介绍,今年毕业,专科,年初就职至今。

在ubuntu先开发qt。

目前的疑惑是,在编程过程发现很多自己的不曾接触过的概念,思想,技巧,总的说是能力、经验不多。

以前还弄不清,一个程序里的 instance 的存在必要。c++智能指针、泛型编程刚有初步的认识。

最近在调试进程间通讯,主管已经嫌弃我花的时间有点多了,就qdbus的基本使用我现在还是迷迷糊糊。

由于阁下的网站上关于qt、c++的资料不是十分的多,但我能感觉到你对编程的那种驾驭的能力。

我的奢望是,阁下能否在有时间空余的情况,给我提供一个大概的规划、思路。
朋友,感激。

以下是我的回复:

 

对于一个刚参加工作(不久)的人来说,可以说是从一个基本上一无所知的状态(很悲哀,中国的大学里所教的东西很少是你毕业后能真正派上用场的,不管你是专 科毕业,还是本科毕业),突然的发现有一大堆的知识需要学习和了解,这对绝大多数人来说都是一个很大的冲击,甚至打击。
所以,对于你这一类的人,我的建议是:好好学习你的工作。

工作入门:

一般新员工入职都会有一到三个月的培训期,这个时候主管会给一个或者几个学习任务,但总的来说培训内容都是那种相对单纯并且目标直接的题目,而且通常会有人对你进行一些必要的指导;
一个月,或者三个月的培训期过了之后,不出意外,你就转正了,这时候先不要急着高兴,这个时候往往是更重要的一段时间,主管会给你分派一些简单但正式的工 作,而这些简单的工作则可能会让你自己独立的去完成,这才是真正考验你的时候,公司会考察你的各方面表现,以决定给你委以什么样的任务和角色。对于一个应 届毕业生来说,没有几个公司会在一年半内对你抱太大的期待,而你的任务就是必须要让公司对你有所期待。
但切忌想法太多,这个也想学,那个也想学,结果就是什么也没学好;更别思想不端正,去想什么跳槽之类的事情,你要搞清楚,现在是你入门的时候。而要想入门快,唯一的方法就是努力把工作相关的技术/技能学好、掌握好,更多、更好、更积极地去参与到产品的开发中去。要知道,你自己学的东西永远都是半成品,或者一知半解就很容易会放弃深入的,而工作相关的技术和技能则是会做成一个真正的产品的,这个才是真正可以学到技术的方向和领域(这一条基本上对所有人都适用)。
在最初的时候,如果基础不是很好的话,切忌刨根问底,有些东西你只要做到“知其然,而不知其所以然”就可以了,等你逐渐的进入状态了,再来考虑“知其然,又知其所以然”。
同时,尽可能的多了解一下原理性的一些东西,如:把产品的框架都了解清楚,至少要从理论上知道这个框架有什么好,为什么好;另一方面在业余的时间,争取多 补充一些基础知识,像你这样的可以补补C/C++和Linux/Unix相关的知识,这样也可以解决你“就qdbus的基本使用我现在还是迷迷糊糊”的这 种问题。
中国现在的年轻人基本上都是独生子女,平时习惯了“拿来主义”,许多人都喜欢走“捷径”。而以你的状况,我看应该不是会去跟人“拼爹”的那种,自力更生是 你唯一的选择,而如果你想要的是一条“捷径”,我可以很负责任的告诉你,没有。只有一步一个脚印,才能走得更好、更远,从而走出一条捷径。

我的经验:

总的来说:
以我个人的经验(我的经验是一路撞墙撞过来的)来说,作为一个程序猿来讲,理想的一个练级过程(不是职业生涯)大致如下:
  • 初级(通常是前两到三年):好好做好所在公司的工作。努力学习和掌握公司产品相关的技术(越多越好),多看多学多问多试多用,同时多阅读一些基础知识相关的资料,尽可能往“深”的方向走,为自己的将来打好基础。
  • 中级(再两到三年):如果你前面的基础已经掌握,那经过那两三年,你应该已经成长为公司的一位主力(之一),然后,再来考虑把自己的视界扩大,逐步往“广”的方面发展。
  • 高级(在一个领域有 五六年的工作经验,并且涉及范围相对广泛):这个时候,你就应该可以不再需要重点考虑“练级”了,自己来好好考虑“职业生涯”这个名词,相信到这个时候你 自己已经有相当的主见和见解,并且具备足够的经验和智慧来解决你所要面对的这种问题了,不管是要考虑继续深入,还是转型,抑或其他。

几点tip:

这是任何时候都有用的几点Tip,跟技术无关,却跟你的未来大大的有关。
1. 如果你真的真的一点也不喜欢自己现在在做的工作,那我劝你就不要做了,先好好的去搞清楚自己想要做什么。
2. 如果你有一天要跳槽,尽量做到每份工作做满两年,这样的经验积累才是真正有意义,否则,现实一点就是浪费时间、浪费自己的生命。也许有些人会说,没事,哥年轻,啥都缺,就不缺时间。
3. 要做好一个程序猿,English是very重要的!

推荐几本书

顺便给你推荐你现在的阶段可能会用得上的几本书:

《C++程序设计语言》http://product.china-pub.com/196448 ,C++之父的大作。

《泛型编程与STL》http://product.china-pub.com/9864 ,STL无论在什么地方,什么操作系统都是非常有用的,主要学习:

a. Container容器:序列容器, 有vector, list, deque, string. 关联容器, 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap, 其他,如stack, queue, valarray, bitset

b. Iterator 迭代器:迭代器统一了容器的访问操作,很好的东西。在迭代器的使用中,常常遇到的一个问题就是,在进行数据的插入删除时的失效问题!其实就是指针的问题哈
c. Algorithm 算法:比如比较、查询、数据移动、复制、交换等等。基础算法:min, max, swap, 排序:sort,替换:replace,查找:find
《Think in C++》http://product.china-pub.com/4801,地球人都知道。

《C++ Primer》http://product.china-pub.com/28767 ,经典。

《Effective C++》http://product.china-pub.com/197414《More Effective C++》(http://product.china-pub.com/197665 )

《设计模式》http://product.china-pub.com/25961 程序猿必读。读至少两遍以上,并思考一下这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。同时推荐阅读一下《深入浅出设计模式》http://product.china-pub.com/27862

《Unix高级环境编程》http://product.china-pub.com/30181 Unix/Linux系 统相关,了解系统层面的东西。从文件系统及其操作开始,到多进程(fork/wait/waitpid)、多线程(pthread)同步或互斥,进程间信 号量通信(signal/kill/raise/alarm/pause/sigprocmask),进程间通信(IPC),网络编程(Socket /select/poll/epoll)等等。当然,还有gcc命令,gdb调试,Makefile。

 麻省理工的免费C/C++的课程:

a.《计算机科学和编程导论》(Introduction to Computer Science and Programming)http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/video-lectures/

b. 《C语言内存管理和面向对象编程》(Introduction to C Memory Management and C++ Object-Oriented Programming)

讲义:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-088-introduction-to-c-memory-management-and-c-object-oriented-programming-january-iap-2010/lecture-notes/

习题:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-088-introduction-to-c-memory-management-and-c-object-oriented-programming-january-iap-2010/assignments/

这些书对很多人来讲,读一遍两遍都是远远不够的,可能会看不懂是一方面,即使你理解了,那也要多读,每隔一段时间就可以去翻翻,因为每次的阅读你都能更多的理解到一些新的东西(BTW:不要问我要电子书,自己网上找去)。
同时实际工作中可能因为每个人的岗位不同、所处的领域不同会有不同的侧重点,如:有的人重点做网络编程的,有的人重点做数据库编程的,有的人重点做界面的,有的人重点是研究算法……但无论是哪一个领域,上面这些知识都是最最基础的,基础也就意味着通用,掌握了这些知识,那未来你无论做哪方面,它都会让你受益。好好学习吧,中国IT的未来就看像你这样的年经人了。
祝你工作愉快,学习愉快,生活更愉快。

Leave a comment

Your email address will not be published. Required fields are marked *