科班和培训生同比于自学者的优势就在于这些计算机专业的核心课程(数据结构与算法这种不管科班培训都要学的不算):离散数学、编译原理、计算机组成原理、操作与系统——乃至图形学和数字图像处理。
如果觉得太抽象学不进去,要么是经验不够写的代码太少,要么就是教材或者老师不给力——后者可以用csapp代替。
![b5a3bbb7b733df314c6d41bcb509d2bd.png](https://i-blog.csdnimg.cn/blog_migrate/815c722c66245917e0c7c99b65e11ccc.jpeg)
哪怕你考完就忘了,哪怕你毕业后写代码时还是要现场搜博客看怎么处理多线程问题,但至少,你对这些概念心里面是有印象的,遇到了问题,你心里有杆尺子——
1、如何从这个问题提炼关键字,上网搜索或询问;
2、这个问题对应哪个领域的知识,我应该直接去查“多线程 互斥锁”而不是查“为什么这个程序跑不对?为什么count不等于100?”
3、读代码、写代码时,起码知道,这里该用多线程组织生产者消费者关系,那堆数据应该用一个树来组织——这方面和设计模式很相似,为我们提供了在更高层面看问题的可能性。
![83d7465ad372463d010dbe419a25fd54.png](https://i-blog.csdnimg.cn/blog_migrate/ad3ebca56fc9ee2fe998aa5f4622251d.jpeg)
4、分得清工具链中各个部分的区别,不至于说mfc、qt、vc、c语言、c++傻傻分不清楚,都在参与几十几百万的项目了,还在到处问人“qt里能不能用FILE*指针?”
举个比较实在的例子,非科班的人,遇到问题是这么问的:
codeblocks 下载的是mingw.setup的,但是还是提示没有编译器?
www.zhihu.comVC++6.0用MFC编译有一个问题。?
www.zhihu.com如何使用Dev C十十画抛物线?
www.zhihu.com
这样的问题,有的让人根本无从回答,有的问题一字不改百度一下都能搜到答案,有的完全是不会提炼关键字的结果……
![881a880fd08c079ca1f79810ae6a4f48.png](https://i-blog.csdnimg.cn/blog_migrate/0303864a76e6a6421d42c6b24eea9a00.jpeg)
而如下面这些问题,就充分体现了提问者自己的思考,他们是有明确的方向和目的去思索、去询问、去查询的,哪怕没人回答,这个过程都能有所收获。
(1)C语言如何实现面向对象功能?
其实,我对科班优势的这些描述,也适用于理工类专业——培养符合科学哲学的思辨能力。在遇到问题后,能够知道如何抽象问题,如何提炼关键,如何分析问题,然后基于抽象/提炼/分析得到的各个角度,去解决问题。
对于答复,小音是认同加佩服的和一些直接想甩baidu.apphb.com链接的问题,他都能从科学思辨的角度上,深入浅出地去分析,去解答,而且在让小白如各类题主能看懂的前提下,还能让我等围观群众有所收益。
理想的程序员
1、能跑
2、代码符号规范,使用工具确保符号规范
3、设计需要可扩展,确保设计能令某些情况下没用的部分不会做成额外的性能开销。
4、设计需要可测试,用单元测试保证基本没有BUG,使用帮助验证正确性的工具。
5、找出各种解决方案的时间复杂度和空间复杂度,过程可能需要查找文献及做组合灯工作。
6、考虑数据在内存中存储方式及访问特性,如对齐问题、时间和空间的连贯性,怎样减少存储量的系统及增加缓存一致性。
7、尽量跨平台,并且如需使用操作系统提供的功能(文件、网络、线程、进程等),选取最优解。
8、关注底层性能,是否适合用一些CPU指令(包括SIMD)、GPU或其他硬件解决。做性能剖析,看核心部分的汇编结果,再做实验改成优化。