天天财汇 购物 网址 万年历 小说 | 三峰软件 小游戏 视频
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页 淘股吧 股票涨跌实时统计 涨停板选股 股票入门 股票书籍 股票问答 分时图选股 跌停板选股 K线图选股 成交量选股 [平安银行]
股市论谈 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
商业财经 科技知识 汽车百科 工程技术 自然科学 家居生活 设计艺术 财经视频 游戏--
  天天财汇 -> 科技知识 -> 你的编程能力从什么时候开始突飞猛进? -> 正文阅读

[科技知识]你的编程能力从什么时候开始突飞猛进?

[收藏本文] 【下载本文】
你的编程能力从什么时候开始突飞猛进?
关注问题?写回答
[img_log]
程序员
编程
编程入门
自学编程
你的编程能力从什么时候开始突飞猛进?
圆桌收录
用代码构建世界
百度多了
你就明白:它也许有用,但它封印了你精进计算机英语的机会。
Google多了
你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。
开始读书了
你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。
接触到国内外大社的经典书后
你就明白:那些烂大街的21天宝典,7周速成,都是些什么玩意,误人子弟!
图灵牛逼,动物牛逼,Manning牛逼。
好书读多了
你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。
多做业务
你就明白:所学的技术该用在哪。
多做用户量大的业务
你就明白:光会用技术,和用好技术是两码子事。
多找第三方开源
你就明白:原来工作摸鱼不是梦。
太随便用第三方
你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。
第一次看完源码
你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。
源码看多了
你就明白:自己的查克拉莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。
再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。
因为,但凡通过点滴付出,累积出来的结果,都是平淡无声的。
突然获得这么多支持,十分感谢大家。
知乎就是师兄的心得记事本,喜欢的可以关注哦~
「卫星|ktshixiong,深度职业规划+」
关于书籍的推荐,师兄挑几本常看常新的经典
一、新手进阶,可看
《重构 改善既有代码的设计》
本书的优点:篇幅短小,示例经典,讲解细致。最重要的是新手读起来不费力,可以作为长久阅读的床头书,开卷必有益。
本书的作用:帮助你学会如何写出有层次的好代码,让你在工作中赢在细节,更容易获得有实力的前辈的认可,职业发展更轻松。
二、寻求职业长久发展,可看
《人月神话》
本书的优点:偏重于讲述编程哲学,几乎无代码阅读成本,笔者像一位睿智的导师,以亦师亦友的口吻,有条有理地为你分析各种项目问题,分享各种工程与人的权衡,还有可靠的处理准则,有志于在编程事业上长久发展的朋友推荐阅读,可以少走很多弯路。
本书的作用:主要是打开你规划工程的格局,次要是积累行业谈资,一石二鸟
《UNIX环境高级编程》
本书的优点:就是全书都是优点,UNIX作为经典中的经典,它的设计理念,基础功能的实现方案,都是值得熟透于心中的,无论往后有多少新系统,最底层的东西都是大同小异。书的内容量大,适合长年小口啃。
本书的作用:打牢基本功,基本功是你技术高度的基石,永远要记住这一点。


广告
《UNIX环境高级编程》
京东
¥147.10
去购买?
此外,不要局限于自己是什么IT岗,只要能帮助你积累优秀的技术思维,好资料再多也不嫌多,职业路走宽了,在IT行业,你什么时候都能走得雄赳赳气昂昂。
更多优秀技术书籍,请看师兄这篇新文章就够了
适合程序员入门与进阶,阅读目的都有说明
→ (持续更新)
在你自学计算机的路上,哪些书籍对你的帮助最大?112 赞同 · 1 评论回答


相关 IT 高赞干货:
师兄总结的一波行业经验(精华版)

作为 IT 行业的过来人,你有什么话想对后辈说的?9510 赞同 · 381 评论回答
师兄多年来对编程的小感悟

普通的程序员和大神级的程序员有什么区别?8181 赞同 · 316 评论回答

怎么在编程中找到快乐,并得到持久的动力?555 赞同 · 22 评论回答
师兄谈自学编程的小心得
(带过 10 来位新人入行的经验)

自学简单编程可行吗?7399 赞同 · 152 评论回答

自学编程的人,都是怎么找到第一份软件开发工作的?819 赞同 · 11 评论回答
师兄关于职场的经验分享

面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?2.5 万赞同 · 889 评论回答


以下为冷门,但我自己很喜欢的知识点。
师兄讲编程的难,有趣又真实得心痛

编程到底难在哪里?356 赞同 · 27 评论回答
师兄实践了多年的自律方法论

如何养成习惯性自律?398 赞同 · 17 评论回答
师兄关于优秀书籍的分享

不同领域的圣经级书籍有哪些?210 赞同 · 11 评论回答


最后,
还是万分感谢大家的支持^_^。
送礼物


[img_log]
[img_log]
8 人已送礼物
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,两家都给的比较高,选择了工作体验更喜欢的腾讯哈哈。
总的来说,学习计算机是需要积累的,花一两年时间啃下那些厚厚的经典书籍后,才能构建自己的知识体系,然后阅读大量优秀源码,做一些有趣的项目,编程能力就能突飞猛进啦。
现在回头来看,大学时光真是如此宝贵,这是人生中为数不多可以静心学习的一段时间,可以不用考虑任何其他事情,每天学习十多个小时。
部分藏书:
















大学时浑水摸鱼,毕业后大约半年,在网络上寻找自学资料时,发现了GitHub和一些程序员论坛,自学了py,然后打开了新世界的大门。
包括购买了梯子,独自啃下两套纯英文官方文档,在GitHub上友好亲切的交流,刷题,看最新的软件工程实践书,等等
===========更新2:===========
一些人问《哈弗大学幸福课》在哪里看
我是在这里看的:https://www.bilibili.com/video/BV1Gs411o71d?p=1
其他的我不知道
=========== 更新 ============
断断续续的收到一些赞,写一些可能对大家有帮助的东西吧:
1、提高知识最好的途径是读书,包括但不限于计算机四大名著《操作系统》《计算机网络》《数据结构》《计算机组成原理》。经典书籍不仅仅有完善有效的知识,更重要的是这些书里的计算机经典思想,一直到现在都没有过时,十分的有用。
2、Github是个好网站,值得习惯性的到上面搜索需要的东西。比如awesome系列和一些质量很高的资料整理项目(整理常见的面试、刷题、常见工具链的git repo)
3、v2ex和知乎都是很好的网站(尽管审核方面被吐槽很多),论坛上有很多很厉害的大佬,关注认真答题大佬的动态对开拓知识领域是有一些帮助的。
4、善用搜索引擎(专指Google),最好能把自己最常用的工具的官方文档啃一遍。主要是习惯英文文档的表达方式+系统的认识自己所用的工具,对自己写文档也是有很多帮助的。
5、因个人有长期的抑郁经历,所以对心理方面关注得也比较多,十分推荐学习《哈弗大学幸福课》。这门课的综合内容十分丰富,实践性很强,能够有效的提高生活、职场中的软技能(沟通能力、抗压能力等)(这门课另外一个很厉害的地方在于,仅仅是上课的方式,也能提高你的逻辑思维能力,毕竟据说是哈弗学生选修最多的课,课程质量极其的高)。
6、有一个我自己打算做但实践得还不太好得地方:看经典开源项目得源码和架构。只看过一些小的玩票性质的开源项目,也学到了不少东西,大型的经典的开源项目还没能看(STL、Git等),这些项目对我来说主要是太庞大,时间上有些不够用。
7、最近在坚持做Leetcode每日一题,也推荐大家一起刷呀。保持手感,很多题看起来简单,但评论区也能看到有趣的知识。
8、关于职业规划这种事情,我以前是没有的(主要还是抑郁+低自尊影响的吧)。现在获取的信息太多太多,没有职业规划很容易被带偏。我是在做了长期的心理咨询+《哈弗大学幸福课》,工作、生活上都有一些经历了之后才慢慢想清楚自己将来的生活与工作要怎么打算。这种事情想清楚过后,做自己想做的事情目标会比较清晰,不会得过且过。
感谢阅读,祝好。
大概……是为了追女生而写了一个游戏的时候吧。
大概七年前,我为了追一个女生,以她和我为主角写了一个战棋类RPG游戏(其实还做了很多别的事情hhhhh),灵感来源于小时候玩的世嘉版《水浒传》。故事的背景是我大学,游戏名字叫做《凌工路2号》。
我一直都觉得,在大学,生产力的来源主要有两件事情:
deadline;荷尔蒙。
这个游戏有对话系统:




有战斗系统:




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


职业/转职系统


职业相克系数表
有角色属性、物品、存档系统:


有剧情:

0

0


地图背景是我的学校
有作战系统和敌人的AI:



0
故事的背景是我的大学,这是中心食堂和足球场:




看到这个毛主席像有人应该会觉得很熟悉吧
我甚至还在综合楼的自动售货机上做了一个物品买卖系统:

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

0

0

0
评论区炸出了很多同道中人:
@杜凯
说:
我去,天涯何处无知己啊,我做过一个类似的玩意 http://www.dklogs.net/xiaoming
@ Authur 说(at找不到这位老哥,刚刚at错一次):
是rpg游戏。
还记得98年和曾经大学同学一起在dos下用turbo pascal写过类似的rpg游戏 红楼梦,扒的剑侠情缘的图片库(分析后发现都是去掉调色板头部的bmp图片),还自己做了地图编辑器可以编辑地图,背景音乐在dos单任务系统下是用中断来持续播放,640k内存不够用,还用到了高位内存和扩展内存,由于dos下声卡驱动问题,代码只能在寝室机器上运行,曾经学校软件大赛前把寝室电脑主机搬到网吧通宵撸代码调试,把门卫大爷还有网吧老板惊得外焦里嫩——没见过来网吧还自带主机的。后来幸不辱使命,参加大赛得了二等奖(因为学校评委说一等奖不能是游戏…)
往事历历在目,恍如昨日,但转瞬间已经二十载过去了,感叹…
如果赞能破万的话我就把可以运行的二进制版本release到GitHub上……
学了OO, 熟悉了“设计模式”, 领悟了IoC和DI, 让我大概感觉到了程序应该有一些结构, 而不是简单的把逻辑用if-else写进去, 这是我感觉自己能力提高的第一次飞跃;
看SICP和CTM让我开始理解程序和编程到底是什么, 特别是对CTM里的最小表达力原则的理解, 这是我编程思想的第二次飞跃;
学了函数式编程思想为我打开了另外一个世界, 引导我去了解haskell, 去稍稍的学习了些category theory(这个是真的难...), 这解放了我编程思想的另外一个纬度, 抽象能力有了质的提高(主要体现在generic programming的能力提高, 高级类型的灵活运用), 我开始有意识的去降低核心程序的"熵"(程序的可能性越多, 各种可能性的概率越均等, 熵越高), 使得程序更容易理解(熵越低信息含量越低则越容易理解), 而把系统的灵活性(比如状态, config等)隔离在核心逻辑之外(这样使得变化可以在一个地方, 比如系统setup时, 集中理解, 然后用理解的setup来很简单的推理核心逻辑在这种setup下会怎样运转), 这样就使得程序的核心复杂度更加接近于核心业务的复杂度(业务的熵是本质复杂度无法用调整程序结构的方法降低, 但是, 本质复杂度也是可以降低的, 请往下看), 但是又没有写死整个系统的灵活度; 这是第三次飞跃;
然而, 最大的飞跃是当我最终把重点从编程本身转移开来之后, 当我开始去看分布式系统算法, 去理解各种云服务的特性, 去深入了解我所工作的领域或者说业务, 去了解和我们组有关系的其他部门的业务, 去了解ML(由于业务相关); 去了解需求获取, 怎样拒绝不合理需求, 怎样调整和简化需求(降低业务本质复杂度的关键), 甚至创造合理需求,去了解测试, 监控, 部署, 构架, 运维, 项目规划和人员部署, 思考为什么junior SDE会犯错, 帮助mentor别人, 甚至开始关心组内的技术文化建设;
这是因为“编程是最重要也是最不重要的事”
这是因为编程作为把思维变为实现的这个循环的最后一步(然后写好的程序会成为新的思考输入和基础,开始新的一轮迭代开发),它和一个项目一个系统的所有其他方面都息息相关:需求获取,问题抽象,测试,监控,部署,框架运用,系统间集成,灵活性,未来拓展性,易用性,系统健壮性,多版本实验性,高层业务决策等等,这使得编程变得无比重要(所有的一切都需要编程来最终落到实地),也毫不重要(编程被所有其他一切所约束和指导)。能够支撑这些所有上层思考的程序才是“好程序”,能够支撑所有这些思考的程序员,才是好程序员。学好/学会编程这件事是把所有需要思考的东西都弄明白都学好之后的自然结果。而把这些思考留给别人,自己只做思维和程序的翻译器(区分创造者和工具人的关键),根本无法写出好的程序来。这也是DDD(Domain Driven Design) 的精神之一 (关于DDD的精神,参见此文的最后一段, 阿莱克西斯:在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进? )
以上引用出自自学编程需要注意什么?
我觉得: 我们在积累技术能力的同时一定要开阔眼界, 这样才不会陷入一个"局部最优解" (随便逮着一个点都能开阔人类边界的天才除外); 眼界太窄以至于学了一点点东西就觉得自己"天下无敌"了, 是我们进步的大敌 (也是曾经是我最大的敌人);
阶段一:啥也不会,抄代码都运行不起来,学会了百度+google,学会了舔着逼脸去求大神。
阶段二:学会天坛看教学视频,得瑟能写一些页面,停留在CURD阶段,顶多培训毕业水平,疑难杂症无能为力。
阶段三:开始了解底层,看书研究底层,原来发现全是数据结构算法、操作系统、网络底层,开始沉迷研究底层技术,用优雅的设计。
阶段四:知道一些底层,开始跟别人喷技术的优雅性,忽略了我们技术是为了业务带来收益。
阶段五:能灵活判断业务的情况,给出合理的技术架构。
总之,突飞猛进的时候是自己会实践用起来,同时在项目环境中碰到问题,研究底层最终解决疑难杂症,随着经历无数个疑难杂症的积累,也就是这时候。
说明:很多小伙伴都在问,就是抛出了现象没说每个阶段怎么解决问题,大家可随便评论区问问题,我收集完统一系统性回答。
没想到瞎写写这么多赞,谢谢大家!
01
近年来,有些读者会问我一些形形色色的问题,让我很难去回答,甚至给不出建设性的意见。
举个例子:
1. 我学习什么能进入优秀的互联网公司工作?
2. 我想做研发我应该学习什么?
众所周知,这问题就像你问学霸说你这么厉害一样让人难以回答。我作为一个双非软工本科学生,经过大学自己摸索和不断试错,毕业开始在百度从事研发工作。其实,我当时也有很多的疑惑,在这里给大家讲讲我的踩坑历程。
记忆中,我当年逛知乎、求助高人、甚至我的导师,都无法给出一个可操作的建议。除此之外,在我那种二本学校,知名企业都不会去咱学校校招,我和学长们对春秋招的概念微乎其微,进大厂是件很困难的事情,概率与踩狗屎不相上下。
作为探路者,求助知乎和论坛,给出的结论几乎都是好好学习数据结构/算法、现在大数据很火你应该学学Hadoop/Spark、你要是会微服务、docker、k8s一定会很加分。
让我想起了我当年问学霸题目如何解?学霸说:这个题目是来源于第X章第X例题,你这样解,答案就出来了,很容易的。至于为什么他能想到,鬼也不知道。
当时,我真的是花里胡哨的啥都学,啥都去倒腾,不知道是不是梁静茹给我的勇气。前端、后端技术栈、Hadoop/Spark、docker/k8s这些几乎都实操过,只是很多只是入门并没有深入研究,效果自然也十分有限。
这些概念,对于小白或者在校生来说,这仿佛在对说你不用学了,除非你天生技术欲望特别强烈。这对于大多数普通人来说,明显是劝退的节奏,可操行十分有限,几乎没有参考价值,不知道从何下手。
其实,道理是没有错的,多研究底层和热门技术栈是有益的。但是,脱离实际情况谈技术就是扯犊子,就像让中国男足拿世界杯冠军显然不符合实际,更应该是根据实际情况,做产出最大的事情,否则会信心全无。
接下来,我系统性拆分问题,在不同阶段应该「学什么」、「如何学」、「学到什么程度」,重点讲我当时遇到的问题,还有我是如何去思考的,最终如何解决的,思路比结论重要。
02
根据问题归类来看,主要在我自己的角度谈谈普通本科如何实现进入Top级互联网工作?
首先,说说在大厂工作都是些什么样的人,他们当年都是背着什么光环混进去的?
经过我的调研和分析,重点说一下在校招中面试官看中和考察的东西。
学历/专业、扎实专业基本功有成果的科研经历省/国家级软件设计大赛丰富互联网公司实习经历小有名气的开源项目经历
大概思路就是,要么你证明你令人信服的天赋如逻辑系统思维、聪明,让人觉得你可以被快速培养;要么你有丰富的工程实战经验,证明你具备优秀工程师的潜质。
当然,你可能会说这么多要求,恐怕神仙也做不到啊,简单太苛刻了。在这里,并不是上述要点全部满足,只是满足其中两项证明你的实力即可,毕竟面试时间十分有限必须有点让人信服的东西啊。
举个例子:
1、假设你是上海交大、华中科大大学毕业的学生,你可能只需要重点复习数据结构/算法等专业知识,辅之把学校的科研经历说一下。可能进入什么阿里华为百度问题都不是很大,专业知识对于你们来说自己不再话下,毕竟考理论就是你们的特长。
2、假如你是双非大学毕业的学生,那么你必须用国家级大赛、开源项目、互联网公司经历证明自己。总之,多做项目,专注于技术本身,让自己更早具备职业软件工程师的实战技能。
简而言之,你没有光环,那就比别人多努力点,提前做好职业规划,把时间投入技术本身不要投机取巧。
03
鉴于上述分析,知道需求是什么?对于我们来说,主要把精力投入在技术本身。
接下来,我们将面临一系列问题。 1. 我应该做什么方向?(方向) 2. 我应该学习什么内容?(规划) 3. 我如何学这些内容?(方法/策略) 4. 我应该学到什么程度?(量化) 5. 如何把理论用到实际项目/产品中?(产出)
不同方向,意味着不同领域不同,学习的知识和实战项目有共性也有差异。在这里,我主要讲一下通用的思路。重点拿我擅长方向举例,其他方向可按照同样思路举一反三。
根据我的经验,可将内容分为原理、应用、擅长方向三个纬度。原理和应用纬度必须学习,方向纬度根据自己擅长方向深入学习。


原理:计算机网络、操作系统、数据结构/算法,这些东西都是专业课好好学即可,数据结构/算法可以偶尔刷题。校招的时候再重点复习,初级阶段不必花太多时间深究。
应用:它是最基础的内容,不管你从事什么领域都将离不开它们。这也是小白入门重点花费时间的地方,你将在这里不断与程序斗争如调试、验证、异常、解决。
方向:不同方向本质上就是在基础应用上扩充,发挥它们擅长领域和特性去解决特定问题。在这里,简单列一下涉及的技术栈。
后端开发:消息队列、缓存、rpc、微服务。大数据开发:Hadoop、Spark、Storm、Flink自动化运维:elk、ansible、zabbix、docker、k8s04
基于上述分析,主要讲了整体思路,大家可能会觉得有点不太好理解。接下来,拿我当时遭遇的处境进行举例阐述,这样让不同水平或时期的同学有不一样的体会。
假如有时光机让时间往后倒退3年,时间来到我刚上大二的时候,作为一枚小萌新开始学习JAVA走上后端开发之路。
对于我来说,操作系统原理、计算机网络先战略性放弃,毕竟刚接触编程,看高大上的原理,每次上课都想睡觉。当然,数据结构/算法我还能好好听听,毕竟我数学功底还行让我不排斥。
为什么不先学习基础性原理?
举例:假设你学骑自行车,你是直接上去就蹬?还是先把轮子拆下来研究清楚原理再去学习怎么蹬?
重点:根据我的经历,在新手阶段不管是接触新的语言,还是新的方向。最快的方式就是先把自行车蹬起来,等你蹬熟练了再去研究轮子是怎么造出来的。
根据上述策略,刨除我踩的一些坑,我把学习征途划分四个阶段,实现学习效率的最优解。


第一阶段:新手入门
在我入门的时候,我遇到的最大困难是代码不会写,DEBUG不会做,程序报错不会看毫无头绪,甚至大家常说的百度一下的关键字我也不知道搜。
这时候,最大的目标就是根据百度/查文档/看视频,把程序调试出预期结果,甚至你抄代码都行,很多时候抄代码你都不一定能DEBUG出预期结果。这就是现实,主要就是要把对编程的排斥消磨殆尽。
这个阶段,不需要太关注底层实现原理,最重要的工作就是把应用层面的技术,不断练习直到熟练掌握上面提到的应用纬度「 编程语言、Linux、数据库、HTTP网络协议 」。
时间:3-6月目标:会调试、会查文档、会用搜索引擎内容:JAVA基础语法、MYSQL数据库、Linux操作系统、HTTP通信协议方法:只关注如何使用技术,难以理解的背下来,不关注底层原理。成果:实现常见的管理系统模块,能部署在服务器上,供他人访问。
对于现已从事计算机行业的同学,其实这部分内容非常简单,可能按照正常水平少则几天,多则不超过一周就能开发出简单模块。简单说,它顶多是普通本科毕设设计水准,主要是让新手在感官上体验软件产品。本质上,在计算机世界里,抽象来看就是数据的计算、传输、存储。随着你的经验增多,你会发现很多技术都是诞生或优化性能都是在解决计算、存储、传输的问题。 在这里,主要让大家在系统的角度感受最简单、最初级的技术模型。


Linux操作系统:承载应用程序、数据库的运行,提供CPU供应用程序计算。应用程序(Java/Python/Php):JAVA主要采用Servlet、JDBC承载网络的传输、数据库连接管理。数据库(MYSQL):主要理解关系类数据库的存储,对数据进行操作。HTTP/TCP:熟悉重点网络协议,它分为包头/包体进行传输,包体格式可能分为form、json、pb、二进制。
作为小白,我们不得不面对一个现实,小白阶段中大多数人对计算机了解几乎为零,尽管你小时候玩游戏贼牛逼。就像写个HelloWorld,你起码要安装好环境,安装好IDE,可这简单的两步都能捶死在坐的各位弟弟。
幸运的是,我们在互联网如此发达的时代,市场如此火爆,视频资源可以随便搜索,甚至自动给你推荐。
我是特别推荐这个时期,大家去完整找一套视频来系统学习。尽管新手视频对于现在的我来说很费时间,但是对当时小白的我来说,这是新大陆,它能带你简单过下计算机体系导图。我在课余时间学习视频,让我在课堂上学习理论的时候,能够有豁然开朗的感觉,自然就比别人强了。
在这里,我就简单给大家推荐一些学习资源。
假如你学习java,推荐你去尚学堂/尚硅谷/网易云课堂,它们会有成熟的学习路线,视频也是那种手把手敲的,新手学习比较友好,我狂喜的是可以不投币白嫖。
第二阶段:项目练习
通过第一个阶段学习,你对编程从一无所知到有所斩获,对计算机世界充满了好奇,甚至有所开心。这时候,你最应该做的就是去满足你装逼的梦想。
假设你是爬虫方向,你应该去爬表情包、爬知乎数据、自动抢票,去满足你无数个装逼梦想。
假设你是算法方向,你可以去研究推荐算法、图像识别模型,去做个商品推荐、人脸识秀一秀。
假设你是后端方向,你可以去研究下网络编程/网站开发开发个仿微信聊天应用,体验下lowB版微信。
画外音:多做项目,坑是一步一步踩出来的。
作为大学生,实验室、软件设计比赛、开源社区都是你发挥现象力的天堂,这些倒腾的经历将是你毕业时最宝贵的经历。
第三阶段:强化理论
经过前两个阶段实践,时间来到大三,这时候基本的软件开发已入门差不多达到普通培训班毕业水平。同时,专业课如数据结构/操作系统/计算机网络也上的差不多了,对概念多多少少有初步了解。
这时候,你会发现很多原理你不懂,将很难更上一层楼。
你不知道使用ArrayList还是LinkedList?你不知道为什么要使用线程池?你不知道为什么分层设计使用分布式场景?
你将处于写代码一时爽,一直写一直爽,遇到性能问题直接土崩瓦解。所以,你不得不去学习理论知识让你走得更远。
问题:为什么在这个阶段强化理论知识?
在新手阶段去强化理论知识,会让你兴趣骤减且产生学了有何用的错觉。同时,这是最好的时机,学校专业课学完你有基础概念,你有实际软件应用场景,这些东西让你深挖理论的时候会快速给你构建起基础图谱,让你兴趣激增不断体验学会的东西,将戳痛你最痛的神经,瞬间把你以前遇到的问题有新的认知,这就是答案。简单说,面向问题,解决问题,让你实实在在感受到成长,这就是成就感的力量。
问题:如何高效的学习理论?


其实,编程语言和计算机基础都是相通的,只要你学透一门编程语言剩下的就大同小异。当然,计算机基础毕竟是枯燥无味的,学习毕竟是有方法的。
举个例子:
站在编程语言的角度,你用心去总结,你会发现不管什么编程语言,变来变去都是换了个花样在谈以下内容。
程序结构(数据类型、控制语句、面对对象、异常处理)集合(list、set、map)文件操作、网络通信(io、bio、nio)线程、线程池
不管在面试还是技术探讨,重点考察的都是集合、网络通信、线程/线程池。源自于它跟计算机基础有紧密结合,你要优化它们你必须具备扎实基本功。
基于我的研究经验,我建议大家在学习计算机基础的时候,不要因为理论而理论。你应该去通过编程语言源码去学习计算机基础,只学你当前认为最重要的。
举个例子:
当我去学习数据结构/算法的时候,我会一边学习源码一边思考数据结构,这样就让我有实际应用场景不会因为理论而理论。我学习list、set源码的时候,我就学会链表、栈。我学习map的时候,我就学会了红黑树、散列表。
当我去学习计算机网络的时候,我会一边学习socket的用法,学习Linux网络通信模型epoll,这样就重点把网络协议学会了。同时,很多应用场景极少的理论知识,我就粗略记忆或者跳过,这样就节约了很多时间。
当我去学习线程/线程池的时候,我会学习锁机制、生产者/消费者模型这些操作系统原理的重要知识,跟编程语言中关联不大的我就粗略记忆。
第四阶段:深究专长
经过前面三个阶段的学习,你已经具备扎实基本功和项目实战经验。接下来,你需要做的就是更加的专业化,研究一些有生产意义的东西。如果你一直写学生管理系统,这些没有价值没有意义的东西,那么毫无意义。
这时候,你应该去互联网公司验证你学习的技能。除此之外,你可以去学习额外的成熟先进技术栈。这样,你就有实际业务经验,就有技术的宽度,同时又有深度,这就是你核心优势,毕竟算法/数据结构这些东西在竞争的时候大家都会。
画外音:去实习,最好去大厂实习,接受互联网软件开发的挑战。要是不能,那么去研究实际企业技术栈的应用与底层研究。
举个例子:
假设你是后端开发,你就可以去学习微服务的技术栈,springboot、dubbo、docker、hadoop都可以去学习。除此之外,设计模式,redis原理都可以去学习研究,只有这样当你去面试的时候,你有很多话题和故事讲给别人听,你的专长研究既可以让你说业务场景,你又可以讲底层原理,对答如流。
05
经过上面的训练,已经具备了解决问题、快速学习、编写代码能力,也就是具备软件工程师的职业素养和扎实基本功。
这时候,进入互联网公司开启职业道路,你将会很快有产出,不会陷入徘徊自闭的状态。更何况,你的职业素养已经能够让你遇到问题,能快速的学习克服困难。但是,要是让你去参加面试可不一定能独善其身,毕竟工作拧螺丝,面试造火箭可不能疏忽大意。
接下来,重点讲一下如何应对面试?
面试也就是把自己卖出去,让别人觉得你值。简历是至关重要的环节,所有的知识和技能全都是围绕它展开,否则毫无意义。因为在面试中,面试官关心你有什么,也就是面试完全围绕着你会的东西展开提问,所以你就把你的优势发挥到极致就行。
环节一:准备简历
简历一定要认真对待,一定要简介精炼,尽可能把内容压缩到一页,毕竟简历筛选就30秒不到。这时候,简历排版、简历字体、简历模板都有讲究,细节决定成败。
在写简历的时候,主要分为个人资料、实习经历、项目经历、专业技能。其实,没什么技巧,参考STAR原则,重点体现你在项目中的价值和思考。
要体现做了什么事情?遇到什么困难?怎么解决的?产出是什么?
假设有读者需要简历模板,可关注提供给大家。
环节二:梳理知识体系和刷面经
以前,学习知识是零散的,学习策略更多是面向解决问题,以至于知识不系统,表达逻辑层次有限。面试官逻辑思维强,所以你必须做好充足准备才能脱颖而出。
最好的策略就是梳理知识体系和准备面经,我们都知道要是你面试官问的问题是你刚好熟悉的问题,你岂不是轻松闯关成功?所以,准备考纲、梳理知识体系、疯狂刷题这就是最好的策略。
按照互联网面试流程大多数分为三轮面。
一轮面试:主要是考察计算机基础知识和擅长语言基础知识,重点考察数据结构/算法、网络编程、擅长语言基础。但是,绝对不是死记硬背的东西,一定是深度和广度紧密结合,环环相扣直到把你肚子里的东西全部挖出来。
举个例子:
获取链表倒数第N个节点的值,只许遍历一次。有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,返回频数最高的100个词。谈谈HashMap,说下它们的数据结构?Key在HashCode取余以后,它可能全部堆积在某几个Key对应的链表上,这样就会造成该数据结构存储或者查询低效,那怎么解决呢?为什么会链表要变成红黑树,什么时候从链表变成红黑树,什么时候从红黑树变回链表?假设多个线程并发访问,那可能造成容器更新或者操作出现问题?除了使用synchronized加同步锁,还有没有其他办法解决呢? 8. 为什么采用CAS,能说一下ConcurrentHashMap的具体实现吗?
你会发现每个问题都是环环相扣,从简单到难,目的就是挖掘出你的极限。大多数情况都是,从数据结构/算法入手,扩展到编程语言特性,再扩展到并发/网络编程不断进行深挖。当直接问实际用法应试者答不出来的时候,就会再次引入到计算机基础知识,这样不断反复调度试探应试者的是深度和广度。
二轮面试:这轮考察实习/项目经历,重点考察你的面试储备。众所周知,大部分应届生项目经验十分有限,大多数是图书馆管理系统、电商系统这样。重点说一下应对策略,可以去网上找你做的项目可能遇到的领域难题,去找解决办法,最终扩展补充到你的项目中。
三轮面试:这轮面试更多是经理考察应试者的基础能力。也就是逻辑思维、抗压、时间管理等基础能力,看下是否能融入团队,毕竟适合团队的才是最好的。
这里主要讲了思路和应对策略,至于篇幅有限,面试题只能读者自己梳理,假设有需要后续再聊。大体的思路: 1. 梳理知识体系看面试可能考哪些东西? 2. 去网上搜寻和整理面试题? 3. 把数据结构/算法、并发编程、网络编程串联起来,还要学会理论知识和实际实战中来回串联。
总之,作为普通学校的同学,你只有花更加多的时间在项目实战中,实习/打比赛/逛开源社区,这些时间让你更快接近成为职业软件工程师。当机会来临的时候,你抓住机会就踏入大厂的大门了,幸运永远不会无缘无故眷顾你。
5月24日,读者问题解答更新:
经过读者提问,再附之我的思考,我大概总结出来分为这么几类问题。
计算机专业需要学什么?找工作,那些计算机专业课学了有用?学不会,我到底适不适合学编程?找工作有那些方向,我应该选择什么方向?专业课和课外编程学习,如何权衡时间?学历普通,我到底是找工作还是考研?
不卖光子,直接说下整体解决思路。
对齐认知:计算机学什么。学习方向:确认学习方向。执行路径:具体学习内容。学习答疑:如何坚持下去。3.1 对齐认知:计算机学什么
问题:那些学了有用?
有用:计算机理论(算法、网络、操作系统)、项目、实习。
企业招人就一个目标:来了公司能干活,培养完能干活。
软件研发这职业,像奖学金、三好学生、学生会主席、英语四六级,对于咱们这职业来说用处不大,有只是能彰显有亮点可作为加分项,锦上添花。当然,你能去拿到这些东西尽量去拿,毕竟别人能拿到,你拿不到你怎么证明你比别人强?
3.2 学习方向:确认学习方向
前端、后端(产品或架构)、测开、运维、大数据开发、数据分析
3.3 执行路径:具体学习内容
从大学时间角度,每个学年会拆分出目标。


从专业知识角度,根据不同解决学习不同知识。


总的来说,实际操作起来还算清晰。
阶段一:找培训机构视频学习,只要能独立实现可让人访问的应用如仿微信聊天软件。
阶段二:做项目,你可能会学习崭新的技术栈(springboot、redis、kafka),需要什么学什么。
阶段三:通过做项目使用了很多新兴技术,计算机理论知识也学了很多。这时候,你核心目标就是把学过的东西总结归纳,拿着他们去面试找工作,这时候你要能说出怎么用,还要说出为什么要用。
开源学习网站:
https://github.com/Snailclimb/JavaGuidehttps://github.com/CyC2018/CS-Notes
要是觉得还得写不错,点击
@码农皮邱
关注,有惊喜!
回顾一下,我的技术能力(不仅仅是编程,而是解决问题的能力)的进步大约有几个重要的节点:
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的水平。
新冠在家隔离,半夜睡不着码字这么多。看完给个赞呗。
我有幸有个姑父在腾讯做的蛮高。。。我曾经请教过他这个问题,他的回答是 ”读顶尖代码“
他有个观点,好的 programmer 不是教出来的,更多是师傅领进门。这个东西就像武侠小说,真正的高手不用你出手,光是走几步,就看得出来了(代码风格)。而所幸一切顶尖的”招式“都在 github 上有对应
要做什么事情 ---> github看看做的最好的是怎么做的 ---> 代码一点点拆分、阅读、分析,看看有什么可以学习、借鉴、模仿,甚至蒙住看自己会怎么写 ---> 自己动手做,学习,比较,学习
具体来说,多关注一些 github 上的技术狂热者,热衷分享技术和代码,比如 lucidrains https://github.com/lucidrains ,用 PyTorch 复现了VIT、AF2、styleGAN、DALLE2、imagen、denoising diffusion 等等各种前沿,真的是宝藏男孩
刷了几百道leetcode之后,发现知乎大神们以前一直在聊的翻转二叉树啊,翻转链表啊,线段树啊,字典树啊,动态规划啊全都是很基础的概念。在破了这些虚妄以后,就不觉得很多事情很神秘了,并且也有基础的算法能力了。
于是开始看一些内置数据结构、内置库的实现,发现c++的map,python的OrderedDict原来也挺简单的,python的bisect,heaq原来跟书上学的内容差不多。
然后开始看有名的开源项目,比如leveldb,知道了memtable,sstable的设计,skiplist,lsm tree是啥。一边惊叹设计的巧妙,一边因为自己能理解最“核心”的科技而感到自信。
然后看了一些诸如《重构》,《代码大全》的“编码行为lint”的书,觉得自己对代码的审美好像也有所提高。
之所以感觉这段时间的学习是突飞猛进,是因为以前的工作全在纠结一些很小的问题上,但同时又发现很多大神都在聊我上面说的这些内容。现在破除了这些虚妄,终于发现从知乎上获得碎片化知识真不如亲身去看一下大神们推荐的书。
突飞猛进靠的是努力爬到巨人肩膀上。但可惜知乎大神们都不是这样的巨人,最多只能算是巨人的搬运工。
先说结论:
1、一定要接触最好的编程体系,好的体系可以达到事半功倍的效果,否则即便智商再高,也有可能要走很长的弯路;
2、切勿有畏难心理,在学习的过程中会遇到数次平台期,期间有可能会怀疑人生,需要熬过去;
3、编程水平的提升需要经过大量的练习,不存在不劳而获;
4、要和优秀的人一起学,遇到不会的问题,要放下面子,敢于提问;
5、遇到不会的知识点,需要硬啃,今天不解决的问题,明天不会自己解决;
6、数学对于编程非常重要,请学好数学;
7、教别人会让你自己水平变高;
我是从初一开始学编程的,一开始学编程只是为了多玩会游戏。2010年在三线城市的普通初中,编程这个事情压根就没有普及,我也不知道学这个东西有什么用,那时就是学着玩呗。因为也没有人教,我就买了一本清华大学出版社出的Pascal的教材在那边瞎折腾。那时候网上也没什么资料,所以我学了三年啥也没整明白,像搜索、最短路这些算法我连名字都没听过,更不用说会写了。
进入了绍兴一中,我突然发现,原来编程不是我以前认为的那样子的,是另一个样子的。因为周围有一些很牛逼的人,就是那些能拿国内甚至国际奥赛金牌的人,我才意识到差距不是一般的大,他们五分钟十分钟能解决的问题,我自己搞了两三天都不知道在干什么,就只能拼命地学,每天压力也很大,因为周围的人都比我水平高,他们都是从好的初中过来的而我的初中水平差,我每天就担心自己会不会垫底,所以心态很不好,人就很焦虑。
我那时从初三暑假开始在绍兴一中学,一个暑假就学会了很多东西,因为有学长带着,就把动态规划、图论基本上都学会了。后来想一想好像我也愿意走这条算法竞赛的路,就继续学了。
我人生有三次编程水平大飞跃的时期,我的高中时期是第一次。但这次背负了太大的压力,因为世界第一次向我敞开了大门,我之前根本就不敢去想清华北大之类的学校,因为我的人生目标一直都只是考上一个一本学校,然后回老家做一个公务员。突然间,看到了不一样的希望,因为太想要,所以最后也得不到。每天就是失眠,两三点要嗑安眠药才能睡着。大冬天下着雪,我穿一件衬衫也会流汗,但我就在那边拼命地学,因为我相信努力还是能出成绩的。那时候确实也学到了很多东西,每天早上七点就到机房,晚上怎么也得到十点十一点睡觉,有比赛的话就要到凌晨两三点,第二天又是七点去机房,每天重复这样的生活,大概过了一年多的时间。最后高中我水平也比较高,小比赛都很牛逼,但由于心态的原因,一到大比赛就会全线崩盘,差点就没大学上了,也受到了很多的质疑,质疑我平时在作弊,因为我平时的水平和比赛的水平差距实在太大了。我受了很大的委屈,我从小就很看不起作弊这件事情。
最后我运气比较好,进了上海交大,进交大的时候,我心里其实是有一股气的。我觉得我要证明我自己,因为高中相对来说还是有点失败的。那我得告诉以前那些小瞧我的人,他们是错的。
很庆幸我进了上海交通大学,无论是从能力上还是思想上都极大地改变了我的一生。
大学的时候,比赛是三个人一队,有两个队友,每天都在一起学习一起训练,这样的道路就不会觉得太孤单,以前一个人的时候会害怕,总会患得患失,现在队友就是坚强的后盾,你就不会再恐惧,因为你们三个人是一个整体。
那时候我也学了很多的数学,因为高中的学习其实很多是建立在猜上的,很多都是靠直觉,直觉就是依靠多次训练之后锻炼出来的,你觉得它是对的,它也确实是对的,但就是不知道为什么。大学学了线性代数、数分等等之后,第一次知道这些为什么是对的,而不是仅仅只会用它们。这件事情让我养成了一个很好的习惯,就是写代码之前要从数学上证明自己的想法,这会让你在写代码、打比赛的时候犯更少的错误。于是我实现了第二次飞跃。
那时候,我和队友们经常一起睡机房,也经常半夜到处翻墙,因为管机房的大爷要赶我们,我们每天要和他打游击。但那时候的生活是快乐的,为什么呢?因为我心中有一个目标,我就是要去战胜世界上最强大的对手,去追求那种一览众山小的感觉,所以你不会觉得那是一种苦,相反你会觉得非常有乐趣。最后的结果说好也不好,因为各种各样的原因,最后到一半我自己就把这个事情停掉了,就去做科研了。
在这个过程中,我花了五年的时间,也慢慢地自己治好了自己内心的不安和焦虑,重新获得了小时候那种平静。最后,我也发现,我压根就不需要向世界证明什么,压根就不需要去打败任何人,我唯一想做的就是,去探索更多的东西,去探索自己的极限到底在哪里,我的人生没有那么多的观众,做好我自己就行了。
又过了几年,当我开始教别人写程序的时候,我的编程水平又实现了一次飞跃。在这个过程当中,我神奇地发现,我对一些基础的理解其实并没有那么深刻,所以就经常讲了一半会讲不出个所以然来,于是就迫使我重新回去思考,突然就发现,自己又能做一些以前做不到的事情,又学会了一些以前好几年都学不会的算法。那就是说,我以前学不会是因为自己对一些事情的基础理解是错误的。所以大家在学习的时候,也要把自己的想法和理解告诉别人,这对你来说也是一个检验和提升的机会。
还有,在学习编程的过程中,我自己遇到了非常非常多的瓶颈期,就是那种半年一年啥都没提高的状态,每天练练练就是过不了那道坎。最后其实发现,其实熬熬就过去了,编程水平的提升好像就是这样的状态,你缓很久,然后突然上一个台阶,然后又缓很久,再提升,如此循环。所以现在大家学不会也不要着急,再熬一熬,也许过一段时间就上去了。
回首往事的时候我觉得自己是幸运的,为什么呢?
第一,我确实遇到了一批世界上最好的人,无论是高中还是大学,大家因为共同的爱好聚在一起,每天不分日夜地去努力,在这个过程中互帮互助;
第二,我接触到了很好的编程体系,因为无论是高中还是大学,都拥有全世界最好的编程训练体系。我为什么对这个事情有很深刻的理解呢,因为我初中三年真的什么都没学会,初中三年做的事,高中一个礼拜就全都能做到了,如果我不进绍兴一中或上海交通大学,我可能一辈子都不会知道编程到底是什么、算法到底是什么;
第三,也是感谢命运给了我那么多的失败,让我非常早地就理解了,成功不是我追求的东西,我追求的是变成一个更好的自己;
第四,在过程中我也抵挡住了很多的诱惑,因为我的初中老师和我讲,我的天赋是低于平均水平的,但就是熬熬熬,好像把比我聪明的人都熬走了,因为他们都去做别的事情了,就我继续在干这个,好像熬一熬我也熬成了这个圈子里水平不那么差的人。所以我相信,很多事情是因为坚持,你才能够与众不同。天赋只能帮助你一时,但只有热爱和坚持才能帮助你一世;
第五,那时候我经常会死磕,经常下一个狠心,我不吃饭不睡觉一定要做完一个事情。如果没有这一次次的死磕,我想我也不会是今天这样。
后来,无论是科研也好工作也罢,我真的看到了很多很多东西,每天都抱着一种好奇心,想要对世界多了解一点,但如果不是因为遇到了编程,遇到了这么多非常优秀的人,遇到了这么多优秀的老师,我这样天赋的人是压根不可能走到今天的。所以,现在我们想把我们的好东西分享给更多的人,我们真的想要把自己了解到的东西开放出来让大家少走一些弯路。因为我们知道走弯路是什么样的感觉,我们知道那种苦涩。那么既然我们有能力,我们就应该帮助更多的人。我们后面做的很多事情都是基于这个逻辑。
[收藏本文] 【下载本文】
   科技知识 最新文章
百度为什么越来越垃圾了?
百度为什么越来越垃圾了?
为什么程序员总是发现不了自己的Bug?
出现在抖音评论区里边的算命真不真?
你认为 C++ 最不应该存在的特性是什么?
为什么 Windows 的兼容性这么强大,到底用了
如何看待Nvidia禁止使用翻译工具将cuda运行
为何苹果搞了十年的汽车还是难产,小米很快
该不该和AI说谢谢?
为什么突破性的技术总是最先发生在西方?
上一篇文章      下一篇文章      查看所有文章
加:2025-05-08 14:26:31  更:2025-05-14 13:37:49 
 
 
股票涨跌实时统计 涨停板选股 分时图选股 跌停板选股 K线图选股 成交量选股 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
网站联系: qq:121756557 email:121756557@qq.com  天天财汇