非CS专业找软件开发工作的经历

其实工作11月初就确定了,不过赶了一个月毕业论文,今天补一篇面经。

  • 背景:985本硕武器相关专业,基础约等于0(大一上过C语言课、大四毕业设计用过MATLAB),研究生期间开始自学CS;无实习经历。
  • 结果:百度、万革始(works application)、微软苏州、小米、招银网络科技、华为、中兴的软件开发工程师offer。

如果通过对“背景-结果”的判断,觉得我的分享可能有价值,可以继续往下看,主要介绍为什么选择成为程序员、自学过程和找工作经历。

前言

我从大二下萌发职业生涯规划的意识,开始寻找自己喜欢的工作;研一期间确定要成为程序员,开启自学之路,其间从互联网中索取很多,这篇文章算是一个回馈。

适合哪些人阅读

  1. 目前没有明确职业规划,不知道程序员这份工作是否适合自己,可以参考“为什么选择成为程序员”部分;
  2. 非CS相关专业,想了解下如何自学CS,希望第一份工作是软件开发工程师;
  3. 想收藏学习资源、课程和书籍。

不适合哪些人阅读

  1. CS相关专业;
  2. 希望第一份工作是算法工程师;

为什么选择成为程序员(TODO,待补充)

自学过程

乔帮主说过

you can't connect the dots looking forward; you can only connect them looking backwards

诚然如此,我在本科期间干了很多当时看起来和学习CS无关的事,不过回首望去,它们都是我CS学习之路上的一个个“dots”。

英语的学习

大三下,准备申请出国做毕业设计,于是备考托福:两个多月填鸭式学习,背单词书、听写、练口语段子,短时间提高了词汇量、听力和口语,这为后面更系统地学习英语提供了基础。

大四保研后,时间更为自由,我从网上得知了恶魔的奶爸(简称奶爸)和奶爸的英语教室(资源很丰富,推荐想学习英语的朋友去看看),利用奶爸提供的方法和资源:

  • 听力方面先后精听了126篇Englishpod,口语方面以纠正语音、语调、锻炼连读为主,跟读学习了American English Pronunciation WorkshopThe American Accent Course 50 Rules You Must Know,这是当时做的一些学习笔记,简直灵魂画手。

  • 然后看了几部英文小说、听了几部英文有声书,第一次上coursera听了一门公开课Microeconomics Principles。之后就赴以“黑科技”著称的俄罗斯做毕设啦。

这段集中学习英语的经历,使我在之后自学CS时:上网听国外公开课不疼了,看英文技术书不累了,起变量名、函数名再也不费劲了LOL

元知识的学习——学习、思维方法、心理学

我整个本科的阅读兴趣集中在方法论、心理学之类的书上,这类书确实对学习新的知识有一定帮助,从实用性与可操作性角度上,推荐几本个人觉得值得一看的书:

  • 刘未鹏laos的博客《暗时间》,信息量超大,更可贵的是附上了原文出处,可以作为阅读指南使用。刘的方法论对于自学者非常实用,比如:

    学习一个东西之前,首先在大脑中积累充分的”疑惑感”

    我在学习CS课程之前,都会自己“瞎搞一番”,我在学《深入理解计算机系统》之前,看了很多偏重应用的书,积累了将近一年的代码经验,不过很多问题原理上不是很明白,这就是积累“疑惑感”。后来学习了CMU 15-213,看了CSAPP,学习过程中没感到一丝枯燥,每天6个小时,津津有味学了3、4个月,就把这门课拿了下来,包括全部习题和Lab。

    刘的文章含金量非常高,比如:

    怎样花两年时间去面试一个人对于想通过自学进入大公司的朋友很有启发;

    数学之美番外篇:快排为什么那样快,看过这篇blog后,一下就理解了面试中的“天平称球”类问题的本质;

    知其所以然(续),把背包问题讲得深入一个层次。

  • 凯利·麦格尼格尔的《自控力》,从生理学、心理学上解释了影响自控力的因素,提出了非常具有操作性的、提高自控力的方法。嫌看书麻烦的,可以看作者给Google工程师的演讲,作者颜值也很高。我其实不是很爱学英语,全靠它撑过去。

  • 时间管理类书。这类书非常之多,比如番茄工作法图解、GTD类的搞定、记录时间类的奇特的一生等等。不过,很多牛人从不遵循时间管理,比如陶哲轩On time management。我的理解是无论时间管理,还是前面的自控力管理,都是为了保证在状态不好的情况下依然能够有所产出,某天状态好,连续搞12个小时不觉得累;某天没有学习的心情,通过一些管理技巧,大概也能学6个小时吧。我早期的习惯是用GTD规划长期的学习计划、每日任务;用时间记录法分析自己每天可以优化的时间;实际学习中采用番茄工作法。不过后来除了用GTD规划长期的学习计划、每日任务外,其他环节都省了,沉迷编程,不能自拔。

其实方法论这东西吧,没有必要追求最好的,独孤大侠不说过嘛:“重剑无锋,大巧不工”,而且,学习过程中走点弯路也没事儿。

的确,也许真的有更好的路,但事前真的很难判断哪条儿是最优的,我们能做到的,是把一条路走通了、走深了,只要不是一条太不靠谱的路,深入的过程中总会有很多的收获。只要不是很顽固,善于反省,总有一天也会逐渐意识到越来越靠谱的路。

——刘未鹏《暗时间》

自学CS

自学CS开始于研究生阶段,一边忙着实验室的项目(主要是使用仿真软件),一边利用一切时间自学。

写在前面

  • 对于编程,我坚持Teach Yourself Programming in Ten Years原则。研究生期间,AI火了起来。不过我觉得,作为非CS专业的我,希望先把计算机基础打好,之后有机会再去学习深度学习什么的,反正时间长着呢。这也是为什么我研究生期间主要自学CS基础课。(这个纯属个人风格,先学深度学习,之后再补计算机基础也未尝不可。)
  • 基于上面的原则,我非常推荐知乎上的这篇文章编程入门指南 v1.5
  • 自学我不希望解释为自己教自己,因为这是忽略教练员作用的观点;我希望将自学解释为自己找资源学,且这个资源最好是循循善诱类的。不得不说,符合这个条件的,多为国外的公开课和教材。
  • 学习CS课程之前,最好先“瞎折腾”一番,在大脑中积累充分的”疑惑感”
  • 看书方法可以参考刘未鹏老师的一直以来伴随我的一些学习习惯(三):阅读方法

准备期

研究生第一年以做为主,写了很多代码,不过并没有学习CS基础课,这一阶段可以称作准备期。

按时间顺序学了以下内容:

  1. 廖雪峰的Python教程的全部内容(包括后面的实战部分)跟着敲了一遍。这个教程基本是self-contained,不需要额外的参考书也能跟下来,甚至是后面用Python metaclass实现ORM,前后多看几次也能看懂。不过最后的实战部分涉及的内容很多,对于没有基础的人,比如我,需要额外学习一些其他知识才能跟下来。

    辅助学习书籍:Python学习手册(第4版)(中文翻译的不太好,可以看英文第5版); Flask Web开发:基于Python的Web应用开发实战

  2. 学完这个教程给我留下了很多疑惑,比如Python的Web开发再底层一些,是怎么实现的?于是顺势学习了Learning Python Network Programming,顺带看了一下Python http.server的源码。书中很多协议介绍的并不详细,这促使我以后学习《计算机网络》;学习中看Python的文档发现Socket中很多参数不明所以,这促使我以后学习《Unix网络编程》。

  3. 在廖的教程中,多线程、多进程理解起来不难,不过协程当时无法想象是怎么实现的,上网逛了一圈,发现Fluent Python有一章是讲这个的,当时还没有中文版,看的英文版,看了一章发现还是没怎么讲原理,不过觉得这书写得实在是好,于是以平均每天20页的速度啃完了全本。后来发现这篇Blog对于协程如何实现讲得不错,【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制,当时欠缺的知识很多,木有看懂LOL

  4. 记得当时我的娱乐方式就是跟着Blog学爬虫玩,其实我不喜欢看Blog学习,因为感觉不系统,而且大多数不列出参考文献,不过当时关于Python爬虫的书还没出

  5. 研究生有一门CFD的课需要用C语言编程,于是通过一站式学习C编程复习C语言,这本书真是少见的国人写的好书。不过里面除了讲C,还涉及算法、编译、链接、计算机体系结构等等,但都是浅尝辄止,不过正好激发了我更深入学习的兴趣。这本书算是学习CSAPP的热身。

  6. 之后就开始学习数据结构和算法了,对于零基础的我,算法入门用的是Problem Solving with Algorithms and Data Structures using Python,完成了全部例题、课后题,对于讲得不详细的章节,比如AVL Tree可以上youtube看MIT公开课。这本书其实很全面,比如Python中数据结构操作的复杂度都有介绍。这本书算是学习算法导论(原书第3版)算法(第4版) 的热身。

这一年学习的收获:

  • 写了很多代码,培养了“代码感”;
  • 积累了很多疑惑感,激发学了CS课程的兴趣,并做好了热身;
  • 习惯了阅读英文文档、英文书籍。

入门期

学了一年编程,研究生第二年开始学习CS课程,这一阶段可以称作入门期,正式踏入CS的门。学习CS课程应该学到什么程度,知乎上陈硕老师的回答我觉得很中肯。

按时间顺序学了以下内容:

  1. 学习神课CMU15-213,完成深入理解计算机系统(原书第3版)全部练习题,完成课程配套所有Lab,这门课推荐跟着视频学,两位老师讲得非常非常好!由于我之前积累了很多疑惑感,又做了热身,所以食用起来非常可口。

    某些章节的辅助书籍:程序员的自我修养

  2. 试水微软实习生招聘,主要是看一下自己和目标的差距,虽说实验室不让实习。为此用Python刷了70多道LeetCode,并学习了《算法导论》《算法》的相应章节。微软实习生招聘用的HihoCoder,笔试题明显和LeetCode不是一个等级的,0分而归。

  3. 看来算法平时练的太简单,于是转战TopCoderCodeforces,这里推荐TopCoder上的算法教程,写的超好,比如把[Binary Search]一章看懂,二分法的边界条件永远都不会写错。在这两个上面虐了自己大概一个月。

  4. 从微软实习生笔试后,开始正式学习C++,方法很简单,通读C++ Primer 中文版(第 5 版) ,16.2章前所有例题、习题写一遍。之后用C++在LintCode刷了一遍剑指Offer : 名企面试官精讲典型编程题,顺便再次学习了《算法导论》《算法》的相应章节。

  5. 6、7月份的时候迷上了LeetCodeHihoCoder的周赛,几乎每周日都参加,发现水平确实比参加微软实习生笔试时提高不少,最好的时候排名双双冲进前10%,微软后来因为HihoCoder上的成绩免了校招笔试。

  6. 学习了Stanford的Introduction to Computer Networking,结合视频看了TCP/IP详解 卷1:协议(原书第2版)(中文翻译超烂,不要看)、计算机网络自顶向下(第6版)

  7. 学习了UNIX网络编程中关于TCP/IP的内容。至此,前面积累的多数疑惑都解决了。

  8. 学习了Linux多线程服务端编程 Linux/UNIX系统编程手册中多线程系统编程相关的内容,这一阶段造了不少轮子;重学了CSAPP中并发编程部分,再次感慨神书。

  9. 本身还想学下Udacity上的佐治亚理工的操作系统概论,结果看了看课程大纲,发现大部分内容我在CSAPP、《Linux/UNIX系统编程手册》或者其他什么地方都学过了。

  10. 校招期间为了准备高频题,粗略浏览了《深度探索C++对象模型》《STL源码剖析》

校招时,我发现研一时自己瞎折腾那些基本都忘光了,而且基本没人问过,反而是第二年学得这些CS课程发挥了很大作用。

--------------楼主被要求修改论文,需要停更几天--------------------

#百度##微软##小米##华为##中兴#
全部评论
你们实验室没事干吗?有那么多时间学习,羡慕!
4 回复
分享
发布于 2018-04-17 20:03
北理还是北航?
1 回复
分享
发布于 2017-11-29 21:30
联想
校招火热招聘中
官网直投
楼主出国做毕业设计?做毕业设计还要出国?还是研究生期间也是在国外念的
1 回复
分享
发布于 2018-01-31 15:28
自制的人可怕~
点赞 回复
分享
发布于 2018-01-31 17:38
啊哈~觉得自己的经历和楼主非常像了!大四也考了当时身边人都觉得没用的托福,因为当时已经保研了不用这个分数,结果现在看英文教材比较轻松了;也学习了有关学习方法的公开课;还有也想从工科转到CS,靠自学。非常感谢楼主的分享!是我的榜样!
2 回复
分享
发布于 2018-05-22 16:59
前排
点赞 回复
分享
发布于 2017-11-29 15:09
学习一下
点赞 回复
分享
发布于 2017-11-29 15:14
伪前排
点赞 回复
分享
发布于 2017-11-29 15:19
mark大佬一下
点赞 回复
分享
发布于 2017-11-29 15:47
BIT大佬
点赞 回复
分享
发布于 2017-11-29 15:56
要签哪里呀?
点赞 回复
分享
发布于 2017-11-29 16:02
坐等大佬更新
点赞 回复
分享
发布于 2017-11-29 16:27
mark一下,坐等大佬更新
点赞 回复
分享
发布于 2017-11-29 16:49
mark
点赞 回复
分享
发布于 2017-11-29 17:57
非cs专业前排围观
点赞 回复
分享
发布于 2017-11-29 18:31
可以
点赞 回复
分享
发布于 2017-11-29 21:42
mark
点赞 回复
分享
发布于 2017-12-06 20:10
千万别读博
点赞 回复
分享
发布于 2017-12-09 20:46
TCP/IP详解建议看卷一
点赞 回复
分享
发布于 2017-12-10 10:11
去哪了?最后选了哪个offer
点赞 回复
分享
发布于 2017-12-17 02:49

相关推荐

头像
不愿透露姓名的神秘牛友
04-02 22:26
已编辑
4.1日14点小米一面 16点 小米二面 17点30momenta 一面4.2日 15.30momenta 二面  18点30momenta 已OC面试记录:小米一面 项目30分钟 八股 多态 封装 智能指针 手撕代码 二叉树层序遍历 回文子串小米二面 各种八股 问麻了 一堆编译原理 通信的 本人非科班的 好多都没回答上 项目讲解 针对性提问 挖的很深 无手撕Momenta 一面 项目30分钟 无八股 手撕 机器人所有路径 a星伪代码 Momenta 二面 针对简历各种基础问题 基于图搜索的 基于优化的 一些公式推导 论文的提问 手撕 岛屿数量 体验就是两家流程真的快,小米一面结束十分钟就通知选二面时间了 ,一面问的都比较基础,但是很相关。小米二面 八股不单单问C++的,还问了很多其他的,对没有准备过的,非科班选手不友好。还有点压力面,会针对项目提问,为什么你没用某某方法,为什么这么优化,传统方法是什么。就是针对一些非重点的地方猛猛提问。但是最后问了一下评价,他说还不错,希望也能OC吧。momenta 一面针对项目,提出来一些比较奇怪的问题,似乎因为面试官不是做这个方向的,因为当时一下午已经两面了,已经麻了,就冷场了好几次。以为会挂了,没想到很快通知二面了。二面的面试官很对口,问题很专业,项目挖的很深。 #面试#  
点赞 评论 收藏
转发
75 600 评论
分享
牛客网
牛客企业服务