找回密码
 立即注册

你的编程能力从什么时候开始突飞猛进?

5
回复
129
查看
[复制链接]

5

主题

0

回帖

15

积分

新手上路

Rank: 1

积分
15
来源: 2023-12-21 09:25:51 显示全部楼层 |阅读模式
你的编程能力从什么时候开始突飞猛进?
回复

使用道具 举报

6

主题

26

回帖

44

积分

新手上路

Rank: 1

积分
44
2023-12-21 09:26:48 显示全部楼层
update:
评论区很多学弟学妹要求整理一个学习路线,刚写了篇文章:
从小白到后端工程师的自学之路 - MutexLock的文章 - 知乎 https://zhuanlan.zhihu.com/p/130364187
---------------
在啃掉一本本计算机经典书籍和写下大量代码以后。
疫情原因回不去学校,作为一个马上毕业,即将入职腾讯的大四生,分享一下自己的学习历程吧。
本人在大学之前从未接触过编程,最开始的编程学习还是在高考完后,从书店买了本C Primer Plus,然后暑假开始啃,前前后后也就看了几十页。
大一上的时候,来到了华中师范大学,还没有转专业到计算机,一直在自学C语言和看一些计算机入门书籍(编码、计算机科学概论)。当时也很迷茫,不知道以后道路如何,所以也学了一些杂七杂八的东西(前端 python啥的),所幸的是,当时坚持把C Primer Plus结结实实地精读了一遍,而且几乎练习题都做了,算是比较好的开端。
大一下,转专业到计算机了,开始自学数据结构,算法和C++,部分看完了 数据结构与算法分析,并且把书上的数据结构实现了一遍,记得当时五月份给自己的flag是看完C++ Primer,然后每天上课看,晚饭吃完后也跑去七号楼刷书,最后囫囵吞枣似的看完了大部分。
大一暑假,txr大佬 @杏仁糖 给我说他面试通过了华科的联创团队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,找到好工作的学长学姐先例很少,一直是没有信心自己能去大厂,直到当时了解到myk @孟永康 学长在春招收割了一系列offer后,才有了些许信心,相信自己如果能够像他那样努力,那么也能够找到好工作(感谢myk学长那时的鼓励和指导)。所以,定下了一年把自己水平提升到能够在大三下春招的时候拿下大厂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号楼某个自习室内,txr大佬一直鼓励我去投简历找实习,本来我一直畏畏缩缩,对自己不太有信心,被鼓励后想着投就投吧。当时投了字节跳动和momenta的实习,面试都比较顺利,于是在大三上就在字节跳动开始了愉快的实习,比自己的计划早了大半年。当时为了准备面试,看了好多牛客网的面经,查漏补缺式地补齐自己的知识盲区。
大三下,基本都是在实习,学习了很多工程实践上的东西,接触了go的技术栈,并且对devops和软件工程方面有了认知,包括代码管理、发布流程、微服务啥的。然后实习的时候骑驴找马,找到了腾讯的暑期实习。因为这个时候没有了找工作的压力,所以开始学一些自己感兴趣的东西,包括Rust(至今水平还是不太行)、分布式系统(DDIA、MIT6.824等),零零散散学了点东西。
大三暑假,腾讯实习了两个月,开始学习kubernetes、各种中间件等实际业务用到的东西,这个时候就感觉拥有到扎实的计算机基础是最重要的东西。
最后,顺利拿到了腾讯转正和字节跳动的秋招offer,两家都给的比较高,选择了工作体验更喜欢的腾讯哈哈。
总的来说,学习计算机是需要积累的,花一两年时间啃下那些厚厚的经典书籍后,才能构建自己的知识体系,然后阅读大量优秀源码,做一些有趣的项目,编程能力就能突飞猛进啦。
现在回头来看,大学时光真是如此宝贵,这是人生中为数不多可以静心学习的一段时间,可以不用考虑任何其他事情,每天学习十多个小时。
部分藏书:















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

5

主题

26

回帖

40

积分

新手上路

Rank: 1

积分
40
2023-12-21 09:27:33 显示全部楼层
当时我还在学微电子,我调查了一下比我高几届的师兄的就业情况。
然后我的编程水平就突飞猛进。
回复

使用道具 举报

8

主题

25

回帖

49

积分

新手上路

Rank: 1

积分
49
2023-12-21 09:28:06 显示全部楼层
回顾一下,我的技术能力(不仅仅是编程,而是解决问题的能力)的进步大约有几个重要的节点:
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的水平。
新冠在家隔离,半夜睡不着码字这么多。看完给个赞呗。
回复

使用道具 举报

7

主题

31

回帖

34

积分

新手上路

Rank: 1

积分
34
2023-12-21 09:28:54 显示全部楼层
大概……是为了追女生而写了一个游戏的时候吧。
大概七年前,我为了追一个女生,以她和我为主角写了一个战棋类RPG游戏(其实还做了很多别的事情hhhhh),灵感来源于小时候玩的世嘉版《水浒传》。故事的背景是我大学,游戏名字叫做《凌工路2号》。
我一直都觉得,在大学,生产力的来源主要有两件事情:

  • deadline;
  • 荷尔蒙。
这个游戏有对话系统:




有战斗系统:




有职业/升级/转职/职业相克系统:



职业/转职系统



职业相克系数表

有角色属性、物品、存档系统:


有剧情:


https://www.zhihu.com/video/1199972733460791296


https://www.zhihu.com/video/1199969996434366464



地图背景是我的学校

有作战系统和敌人的AI:




https://www.zhihu.com/video/1199816448673271808
故事的背景是我的大学,这是中心食堂和足球场:





看到这个毛主席像有人应该会觉得很熟悉吧

我甚至还在综合楼的自动售货机上做了一个物品买卖系统:


https://www.zhihu.com/video/1199817616090726400
这个游戏大概不到一万行Qt代码,没有用任何的框架和引擎,现在看来相当原始,所有的移动和动画效果都是用Qt的定时器+一堆if/else判断徒手撸出来的(当时不知道更好的办法,就这么一根筋地写了几个月)。我自己的感觉是,写代码超过5000行的时候,自己的能力会有一个飞跃——以前从没有注意过的东西开始觉得费解,从而逼迫自己思考和学习,然后进步。在我参加校招的时候,这个游戏的代码量占我当时的代码量的差不多一半……现在回想起来,我校招能进阿里,这个游戏带来的能力提升功不可没。
这个游戏没有最终完成,也从未发布,静静地在我的硬盘里躺了七年。
四年前我跟游戏设定的女主角结婚了。
这周二我无意中看到它,拿到现在的机器上重新编译通过。在吃晚饭的时候,我问她:
“你知道我当时给你写了个游戏么?“
她说:“不知道啊”。
<hr/>代码在这里(我知道它很烂),遵守WhatTheFuckPublicLicense,随便修改:
https://github.com/blindpirate/no2-linggong-road<hr/>最后放几个全地图的场景,如果你和我是一个学校的,会觉得相当亲切。不过,大部分的地图都不是我做的,我自己做了中心食堂、综合楼、研教楼、校医院、一馆五个场景的室内地图。


https://www.zhihu.com/video/1200365109958516736


https://www.zhihu.com/video/1200365234147590144


https://www.zhihu.com/video/1200365395993206784
<hr/>评论区炸出了很多同道中人:
@杜凯 说:
我去,天涯何处无知己啊,我做过一个类似的玩意 http://www.dklogs.net/xiaoming
@ Authur  说(at找不到这位老哥,刚刚at错一次):
是rpg游戏。
还记得98年和曾经大学同学一起在dos下用turbo pascal写过类似的rpg游戏 红楼梦,扒的剑侠情缘的图片库(分析后发现都是去掉调色板头部的bmp图片),还自己做了地图编辑器可以编辑地图,背景音乐在dos单任务系统下是用中断来持续播放,640k内存不够用,还用到了高位内存和扩展内存,由于dos下声卡驱动问题,代码只能在寝室机器上运行,曾经学校软件大赛前把寝室电脑主机搬到网吧通宵撸代码调试,把门卫大爷还有网吧老板惊得外焦里嫩——没见过来网吧还自带主机的。后来幸不辱使命,参加大赛得了二等奖(因为学校评委说一等奖不能是游戏…)
往事历历在目,恍如昨日,但转瞬间已经二十载过去了,感叹…
如果赞能破万的话我就把可以运行的二进制版本release到GitHub上……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

15

主题

30

回帖

72

积分

注册会员

Rank: 2

积分
72
2023-12-21 09:29:33 显示全部楼层
百度多了
你就明白:它也许有用,但它封印了你精进计算机英语的机会。
Google多了
你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。
开始读书了
你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。
接触到国内外大社的经典书后
你就明白:那些烂大街的21天宝典,7周速成,都是些什么玩意,误人子弟!
图灵牛逼,动物牛逼,Manning牛逼。
好书读多了
你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。
多做业务
你就明白:所学的技术该用在哪。
多做用户量大的业务
你就明白:光会用技术,和用好技术是两码子事。
多找第三方开源
你就明白:原来工作摸鱼不是梦。
太随便用第三方
你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。
第一次看完源码
你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。
源码看多了
你就明白:自己的查克拉莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。
再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。
因为,但凡通过点滴付出,累积出来的结果,都是平淡无声的。
<hr/>突然获得这么多支持,十分感谢大家。
知乎就是师兄的心得记事本,喜欢的可以关注哦~
关于书籍的推荐,师兄挑几本常看常新的经典

一、新手进阶,可看
《重构 改善既有代码的设计》
本书的优点:篇幅短小,示例经典,讲解细致。最重要的是新手读起来不费力,可以作为长久阅读的床头书,开卷必有益。
本书的作用:帮助你学会如何写出有层次的好代码,让你在工作中赢在细节,更容易获得有实力的前辈的认可,职业发展更轻松。
二、寻求职业长久发展,可看
《人月神话》
本书的优点:偏重于讲述编程哲学,几乎无代码阅读成本,笔者像一位睿智的导师,以亦师亦友的口吻,有条有理地为你分析各种项目问题,分享各种工程与人的权衡,还有可靠的处理准则,有志于在编程事业上长久发展的朋友推荐阅读,可以少走很多弯路。
本书的作用:主要是打开你规划工程的格局,次要是积累行业谈资,一石二鸟

《UNIX环境高级编程》
本书的优点:就是全书都是优点,UNIX作为经典中的经典,它的设计理念,基础功能的实现方案,都是值得熟透于心中的,无论往后有多少新系统,最底层的东西都是大同小异。书的内容量大,适合长年小口啃。
本书的作用:打牢基本功,基本功是你技术高度的基石,永远要记住这一点。
此外,不要局限于自己是什么IT岗,只要能帮助你积累优秀的技术思维,好资料再多也不嫌多,职业路走宽了,在IT行业,你什么时候都能走得雄赳赳气昂昂。
更多优秀技术书籍,请看师兄这篇新文章就够了
适合程序员入门与进阶,阅读目的都有说明
→ (持续更新)
<a href="http://www.zhihu.com/question/421913237/answer/2976883265" data-draft-node="block" data-draft-type="link-card" data-image="http://pic4.zhimg.com/v2-76bae9fa183cfdc867836dedd0a7141f_180x120.jpg" data-image-width="905" data-image-height="476" class="internal">在你自学计算机的路上,哪些书籍对你的帮助最大?相关 IT 高赞干货:
师兄总结的一波行业经验(精华版)

作为 IT 行业的过来人,你有什么话想对后辈说的?师兄多年来对编程的小感悟

普通的程序员和大神级的程序员有什么区别?→
怎么在编程中找到快乐,并得到持久的动力?师兄谈自学编程的小心得
(带过 10 来位新人入行的经验)

自学简单编程可行吗?→
自学编程的人,都是怎么找到第一份软件开发工作的?师兄关于职场的经验分享

面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?人生在世有哪些观念是越早建立越好的?以下为冷门,但我自己很喜欢的知识点。
师兄讲编程的难,有趣又真实得心痛

编程到底难在哪里?师兄实践了多年的自律方法论

如何养成习惯性自律?师兄关于优秀书籍的分享

不同领域的圣经级书籍有哪些?最后,
还是万分感谢大家的支持^_^。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
商业洽谈 文章投递 寻求报道
客服热线: 400-113-0968
关注微信