
最近,小编在某乎上看到这样一个问题:

1
某乎好友:飘逸的师兄
百度多了
你就明白:它也许有用,但它封印了你精进计算机英语的机会。
Google多了
你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。
开始读书了
你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。
接触到国内外大社的经典书后
你就明白:那些烂大街的21天宝典,7周速成,都是些什么玩意,误人子弟!
图灵牛逼,动物牛逼,Manning牛逼。
好书读多了
你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。
多做业务
你就明白:所学的技术该用在哪。
多做用户量大的业务
你就明白:光会用技术,和用好技术是两码子事。
多找第三方开源
你就明白:原来工作摸鱼不是梦。
太随便用第三方
你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。
第一次看完源码
你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。
源码看多了
你就明白:自己的编码内力莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。
再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。
因为,但凡通过点滴付出,累积出来的结果,都是平淡无声的。
2
某乎好友:MutexLock
在啃掉一本本计算机经典书籍和写下大量代码以后。
疫情原因回不去学校,作为一个马上毕业,即将入职大厂的大四生,分享一下自己的学习历程吧。
本人在大学之前从未接触过编程,最开始的编程学习还是在高考完后,从书店买了本C Primer Plus,然后暑假开始啃,前前后后也就看了几十页。
大一上的时候,来到了华中师范大学,还没有转专业到计算机,一直在自学C语言和看一些计算机入门书籍(编码、计算机科学概论)。当时也很迷茫,不知道以后道路如何,所以也学了一些杂七杂八的东西(前端 python啥的),所幸的是,当时坚持把C Primer Plus结结实实地精读了一遍,而且几乎练习题都做了,算是比较好的开端。
大一下,转专业到计算机了,开始自学数据结构,算法和C++,部分看完了 数据结构与算法分析,并且把书上的数据结构实现了一遍,记得当时五月份给自己的flag是看完C++ Primer,然后每天上课看,晚饭吃完后也跑去七号楼刷书,最后囫囵吞枣似的看完了大部分。
大一暑假,朋友给我说他面试通过了华科的联创团队Unique Studio,而且给我说他们团队都特别厉害,有些人在军训的时候就把C++ Primer给蹲着看完了,当时十分钦佩,幻想也能够进入贵团队。于是打算在大二上的时候,去报名他们的秋招。所以,那个暑假在学校自学,呆了五十多天。最初,拿起一本APUE,看了一章后感觉看不懂又放下了。然后,又拿起一本红色封面的算法第四版,这本书看完了,并且用C++把上面的算法都实现了一遍。另外,听说CSAPP是必看的神书,当时也懵懵懂懂地看了前面三章,做了lab。为了学习linux,还看了一本叫linux命令行大全的书。武汉的夏天很热,只能寂寞待在宿舍的我,打开了LeetCode的世界,写了一百多道题。
大二上,十月,忐忑迎来了联创的面试,前面两轮都过了,直到其特色的“熬夜测试”环节,因为实力不足+精力不足,测试败北,没有通过。清晨七点,在回学校的公交车上思考自己不足,总结是知识体系仍然不够完全,而且深度也不够。后来这个学期有点“误入歧途”的意思,入了Machine Learning的坑,记得当时花了好几个月刷完西瓜书和吴恩达机器学习课程的讲义(真佩服当时的毅力,都是英文和公式推导),后来想了想,ML/DL这个东西有点玄学,于是毅然决定成为一名做工程的程序员。总的来说,虽然这个学期的时间都投入到ML的学习中,没有学习工程方面的东西,只有用python写了一点好玩的爬虫,但是给了我以后坚定走工程方向的决心吧。
大二下,这个学期是打下计算机知识基础的关键时期。找了一系列书单,看完了CSAPP(做了lab,为了bomb lab还通宵了,强迫症想让自己把炸弹都拆了)、半本算法导论、effective C++、计算机网络系统方法(前三章)、部分TCP/IP详解等,做了一些项目,比如正则引擎(这个是参考了轮子哥的教程)等等,尝试写JSON库(未遂)。其实,因为学校只是一个普通211,找到好工作的学长学姐先例很少,一直是没有信心自己能去大厂,直到当时了解到一位学长在春招收割了一系列offer后,才有了些许信心,相信自己如果能够像他那样努力,那么也能够找到好工作(感谢学长那时的鼓励和指导)。所以,定下了一年把自己水平提升到能够在大三下春招的时候拿下大厂offer的目标。
大二暑假和大三上也一直为这个目标奋斗,补上了APUE、部分UNP、深度探索C++对象模型、STL源码剖析、操作系统概念、操作系统真象还原、Linux多线程服务端编程、部分C++ template、部分C++ Concurrency in Action等书籍。然后,也一直没有放弃刷题,LeetCode写到了三百多道。同时也做了一些项目,跟着操作系统真象还原写的操作系统、简单的协程库,阅读了一些优秀的开源项目,SGI STL、muduo、libgo、libco等。中途还对haskell产生过兴趣,打印了一本Learn Yourself Haskell For Great Good,看完后感觉坑太深,还是专注找工作吧,haskell对我一直都有很强的吸引力,但是这种也只能作为爱好吧。另外,编译器也是有这种魔力,看了部分编译原理(龙书)、部分现代编译原理(虎书)和部分Engineering a Compiler,多次尝试写自己的编译器,多次未遂(不过现在有空了,在补上之前的烂尾项目)。当年的笔记哈哈:

时间到了12月份,9号楼某个自习室内,朋友一直鼓励我去投简历找实习,本来我一直畏畏缩缩,对自己不太有信心,被鼓励后想着投就投吧。面试比较顺利,于是在大三上就在某大厂开始了愉快的实习,比自己的计划早了大半年。当时为了准备面试,看了好多牛客网的面经,查漏补缺式地补齐自己的知识盲区。
大三下,基本都是在实习,学习了很多工程实践上的东西,接触了go的技术栈,并且对devops和软件工程方面有了认知,包括代码管理、发布流程、微服务啥的。然后实习的时候骑驴找马,找到了另一大厂的暑期实习。因为这个时候没有了找工作的压力,所以开始学一些自己感兴趣的东西,包括Rust(至今水平还是不太行)、分布式系统(DDIA、MIT6.824等),零零散散学了点东西。
大三暑假,腾讯实习了两个月,开始学习kubernetes、各种中间件等实际业务用到的东西,这个时候就感觉拥有到扎实的计算机基础是最重要的东西。
最后,顺利拿到了现大厂转正和前大厂的秋招offer,两家都给的比较高,选择了工作体验更喜欢的现公司哈哈。
总的来说,学习计算机是需要积累的,花一两年时间啃下那些厚厚的经典书籍后,才能构建自己的知识体系,然后阅读大量优秀源码,做一些有趣的项目,编程能力就能突飞猛进啦。
现在回头来看,大学时光真是如此宝贵,这是人生中为数不多可以静心学习的一段时间,可以不用考虑任何其他事情,每天学习十多个小时。
3
某乎好友:Light
大学时浑水摸鱼,毕业后大约半年,在网络上寻找自学资料时,发现了GitHub和一些程序员论坛,自学了py,然后打开了新世界的大门。
包括购买了梯子,独自啃下两套纯英文官方文档,在GitHub上友好亲切的交流,刷题,看最新的软件工程实践书,等等。
写一些可能对大家有帮助的东西吧:
1、提高知识最好的途径是读书,包括但不限于计算机四大名著《操作系统》《计算机网络》《数据结构》《计算机组成原理》。经典书籍不仅仅有完善有效的知识,更重要的是这些书里的计算机经典思想,一直到现在都没有过时,十分的有用。
2、GitHub是个好网站,值得习惯性的到上面搜索需要的东西。比如awesome系列和一些质量很高的资料整理项目(整理常见的面试、刷题、常见工具链的git repo)
3、v2ex和知乎都是很好的网站(尽管审核方面被吐槽很多),论坛上有很多很厉害的大佬,关注认真答题大佬的动态对开拓知识领域是有一些帮助的。
4、善用搜索引擎(专指Google),最好能把自己最常用的工具的官方文档啃一遍。主要是习惯英文文档的表达方式+系统的认识自己所用的工具,对自己写文档也是有很多帮助的。
5、因个人有长期的抑郁经历,所以对心理方面关注得也比较多,十分推荐学习《哈弗大学幸福课》。这门课的综合内容十分丰富,实践性很强,能够有效的提高生活、职场中的软技能(沟通能力、抗压能力等)(这门课另外一个很厉害的地方在于,仅仅是上课的方式,也能提高你的逻辑思维能力,毕竟据说是哈弗学生选修最多的课,课程质量极其的高)。
6、有一个我自己打算做但实践得还不太好得地方:看经典开源项目得源码和架构。只看过一些小的玩票性质的开源项目,也学到了不少东西,大型的经典的开源项目还没能看(STL、Git等),这些项目对我来说主要是太庞大,时间上有些不够用。
7、最近在坚持做Leetcode每日一题,也推荐大家一起刷呀。保持手感,很多题看起来简单,但评论区也能看到有趣的知识。
8、关于职业规划这种事情,我以前是没有的(主要还是抑郁+低自尊影响的吧)。现在获取的信息太多太多,没有职业规划很容易被带偏。我是在做了长期的心理咨询+《哈弗大学幸福课》,工作、生活上都有一些经历了之后才慢慢想清楚自己将来的生活与工作要怎么打算。这种事情想清楚过后,做自己想做的事情目标会比较清晰,不会得过且过。
4
某乎好友:blindpirate
大概……是为了追女生而写了一个游戏的时候吧。
大概七年前,我为了追一个女生,以她和我为主角写了一个战棋类RPG游戏(其实还做了很多别的事情hhhhh),灵感来源于小时候玩的世嘉版《水浒传》。故事的背景是我大学,游戏名字叫做《凌工路2号》。
我一直都觉得,在大学,生产力的来源主要有两件事情:
- deadline;
- 荷尔蒙。
这个游戏有对话系统、战斗系统、职业/升级/转职/职业相克系统,也有角色属性、物品、存档系统:

有剧情:

有作战系统和敌人的AI:

这个游戏大概不到一万行Qt代码,没有用任何的框架和引擎,现在看来相当原始,所有的移动和动画效果都是用Qt的定时器+一堆if/else判断徒手撸出来的(当时不知道更好的办法,就这么一根筋地写了几个月)。我自己的感觉是,写代码超过5000行的时候,自己的能力会有一个飞跃——以前从没有注意过的东西开始觉得费解,从而逼迫自己思考和学习,然后进步。在我参加校招的时候,这个游戏的代码量占我当时的代码量的差不多一半……现在回想起来,我校招能进大厂,这个游戏带来的能力提升功不可没。
这个游戏没有最终完成,也从未发布,静静地在我的硬盘里躺了七年。
四年前我跟游戏设定的女主角结婚了。
这周二我无意中看到它,拿到现在的机器上重新编译通过。在吃晚饭的时候,我问她:
“你知道我当时给你写了个游戏么?“
她说:“不知道啊”。
5
某乎好友:胡嵩
回顾一下,我的技术能力(不仅仅是编程,而是解决问题的能力)的进步大约有几个重要的节点:
1. 刚入行时的入门练习题
这个是当某公司网页搜索部门的传统,不知道现在还有没有,入职第一个任务是完成两道练习题。一题是在Linux上用纯C(不许用C++,没有stl可用)完成一个多线程的网页抓取器,另一题是同样的环境语言完成2G大小的query(搜索查询词)的top100提取,有时间要求。
入厂之前我在Linux上没有写过代码。
两天时间从Linux基本命令的熟悉,vim gcc gdb的使用学习,从malloc和free开始搞内存管理,从0开始码hashtable(还得自己写hash函数),从socket开始实现http client和各种协议码解析,使用pthread多线程和信号量互斥同步,基本把操作系统计算机网络复习了一遍。
这两天把我四年本科三年研究生没搞扎实的工程基础全部补上了。
结论:有目的的练习,尤其是一个完整的应用问题的解决,是学习的不二法门。
2. 接手一个完整的模块(子系统)
搞完入门练习,leader过来跟我说:小胡,现在有一个重要的模块交给你,赶紧熟悉一下,然后完成如下功能升级。
这个模块是前厂存储网页的核心模块,在当年内存4g的奔腾主机上单机存储几千万网页,几台机器存下了当时整个中文互联网。支持高性能的随机存取和顺序读,可以说把机器性能压榨到了极致。
3w行,纯C。
啃了几天终于搞明白了结构,(多年以后我还得感谢source insight),同时也对写这个模块的大牛佩服的五体投地,为了压榨内存把每一个bit都物尽其用,各子模块之间的分工又是那么的优雅。
然后是上手改,看懂了之后功能升级很简单,只改了十几行代码,但上线的时候真是手发抖!
后来才知道这个模块好几个前任都没成功接下来就被fire了....
后来又经历了若干次升级,解决各种诡异bug(搞过高并发存储系统的应该知道坑有多深),编码和解决问题的能力突飞猛进。
结论: 学习系统设计的最佳途径是看一个优秀设计的源码,检验成果的方式是改造它应用于你的实际场景。
3. 接手一个完整的系统
搞定存储模块之后,我的下一个任务是升级和扩展一个完整的抓取系统。
和入门练习做的抓取器不同,这个完整的抓取系统(又称spider)是工业级的,需要每天完成千万级的抓取量,还需要考虑并发压力控制,网页更新调度,垃圾网页处理,去重等等诸多现实的工程问题。
大大小小十来个模块,十来万行代码,大部分是C,还有接近一万行的bash脚本(用bash实现分布式的网页去重处理你信?)
这时会发现很多模块内部都有不少实现不尽如人意的地方,但是由于借口定义的好,模块直接容错性强,整个系统还是work的。
这促使我思考系统级的架构,最需要关注的重点是什么,良好的结构远胜于细节的雕琢。
大约小半年后,我对这个系统基本做到出任何问题能立刻反映到是那个模块出的问题,对问题的分析定位能力又上了一个台阶。
结论: 理解了接口定义和系统结构重于实现细节,就迈出了架构师的第一步。
4. 设计一个完整的子系统
此时大概工作快两年了,原来的抓取系统有一个很大的问题,就是积累的网页数太多,更新资源分配不过来,导致系统中大量网页在互联网上已经404但仍然会进到线上被检索出来。我们称之为死链接问题
通过对死链的规律分析,我发现互联网上大部分死链存在站点或目录级聚集的现象,这个其实很好理解,一个网站无力维护了,自然就全部挂掉,目录级很可能是网站改版了,或者一个子频道关闭了。利用这个规律,我们可以大幅度降低死链检测的资源耗费。
在这个认识的基础上,我设计了一个独立的死链检测系统。上线效果很不错,检查死链的流量开销降低到原来10%,网页库中死链还下降了。
结论: 架构师首选要解决的是待解决问题的精确描述,和对问题域的分布规律的挖掘,然后才是结构设计。
5. 设计一个新的系统
工作第四,五年间,hadoop在业界逐渐流行起来,基于Google三件套的设计,当年的hadoop最上层的table还很不完善,但是mapreduce和hdfs已经很可以用了。 如何利用分布式基础框架改造系统,让系统更健壮(以及永更廉价的硬件給公司省钱),成了当时的一个重要问题。
整个抓取系统和建库系统的分布式改造,相当于重新设计一个新的大系统。需要考虑方方面面,如何逐步升级兼容原有系统?如何保证功能的完整性?原有设计中有一些不合理的地方,如何利用这次迁移同步改造?
主导完这些工作后,系统架构方面再也没有遇到搞不定的问题。
结论: 好的架构师需要在合适的时机解决重要的问题,业务发展才能给你这样的机会。
上面5个节点,大致是T3 T4 T5 T6 T8的水平。
6
某乎好友:Dr.Evil
当时我还在学微电子,我调查了一下比我高几届的师兄的就业情况。
然后我的编程水平就突飞猛进。
7
某乎好友:风口浪尖上的猪
垃圾本科,非清北复交985牛逼学历,
智商平平,非ACM拿牌sci论文天才光环选手。
编程从来没有什么突飞猛进,都是在
一道又一道的算法题,
一场又一场的算法比赛,
一本又一本的技术书籍,
一篇又一篇的技术博客,
一个又一个的项目Demo中.... 逐步成长起来的。
作为一个出身非常一般的计算机本科同学,就只靠自己一个人的努力,本科毕业前实习过多个大厂,拿到多个大厂offer。
从大一开始,只靠自己,疯狂努力。不仅所有计算机相关科目课程的成绩全都拿到90+满绩点的分数,同时,在大学用拼命的两年的时间, 做完了其他优秀的学长学姐三年才做完的事情,努力参加各种计算机相关比赛,获得若干省部级,国家级奖项,拿光了学校里所有学年的各种奖学金,并在大二就以综合素质全系第一名的成绩就拿到了学院唯一的国家奖学金。大学四年时光,整整两年没有回过家,不是在实习就是在兼职。保研曾在某985院校复试排名第一,最后以排名靠前的成绩保送至浙江大学计算机硕士。本科毕业前实习过多个大厂,拿到多个大厂offer......
我知道我其实算不上计算机系最厉害,最努力的同学,
但是当我毕业后看到这个问题,
脑海中回想到当年那么努力的自己,心里是真的如翻江倒海,五味杂陈。
一个从十线小城市出来,
没有优渥的家境,没有过人的天赋,没有从小就受到精心的培养,良好的教育的普通人,
要么拼命努力,要么自暴自弃,好像就没有其他选项?
平淡无奇的普通人,拼不了爹,拼不了妈,只能拼命。
8
某乎好友:GeekPlux
那是一个很普通的下午,第一份工作。当时的上司把我叫过来说:这块的逻辑这么简单,怎么写了这么久啊。我来带你写一遍吧。
接着,他一步一步讲解,边讲边写。先把他想的思路告诉我,然后就直接动手写,卡住了就再退回去重新想,其间不时我也会有疑问,他直接回答。写完了又review了一遍,把能优化的地方优化完并把格式排版好看后,提交,搞定。
整个过程让我明白了,实际项目中的编程和大学里做题做作业是完全不同的:
- 好的逻辑需要设计;
- 好的数据结构也需要设计;
- debug是最平常不过的事,不是每个人都能一次性写对;
- 好的代码不是一口气写完,也是需要迭代和优化的;
- 结对编程是最好的教学/学习方式。
编程实际上是一门设计的艺术,如何把现实中的事物抽象成二进制考验的是设计功力。经此一役,好像打通任督二脉一样,后来的学习都一马平川无比畅快。同时还学会了一句很经典的名言:
A language that doesn't affect the way you think about programming, is not worth knowing.——Alan Perlis
如果一门计算机语言无法对你的编程思考方式产生影响,那么它就不值得你去学习。
https://www.bilibili.com/video/av3987709/
9
某乎好友:NarCor4
当我开通了chatGPT plus会员的时候。
10
某乎好友:我还在寻觅归途
我有幸有个姑父在某大厂做的蛮高。。。我曾经请教过他这个问题,他的回答是 “读顶尖代码”。
他有个观点,好的 programmer 不是教出来的,更多是师傅领进门。这个东西就像武侠小说,真正的高手不用你出手,光是走几步,就看得出来了(代码风格)。而所幸一切顶尖的“招式”都在 github 上有对应。
要做什么事情 ---> github看看做的最好的是怎么做的 ---> 代码一点点拆分、阅读、分析,看看有什么可以学习、借鉴、模仿,甚至蒙住看自己会怎么写 ---> 自己动手做,学习,比较,学习。
具体来说,多关注一些 github 上的技术狂热者,热衷分享技术和代码,比如 lucidrains (https://github.com/lucidrains ),用 PyTorch复现了VIT、AF2、styleGAN、DALLE2、imagen、denoising diffusion等等各种前沿,真的是宝藏男孩。
https://www.zhihu.com/question/356351510













