ninechapter
<https://www.zhihu.com/people/crackinterview>
美帝代码搬运工,资深面试官,微信公众号-九章算法(ninechapter)

当你提出这个问题的时候,总有人会告诉你,你应该学习这个,学习那个,亦或者是刷题根本没用,你应该去做项目,亦或者你看这个视频没什么卵用,你应该自己去实现一遍,亦或者是你应该使用xxx框架,xxx语言,做一个xxx系统,这样你才能学到很多。我想说这些建议大多没有太多的实践操作性。对于一个编程菜鸟,很多事情都是陌生的,即使拿到一个文档,也不知道如何去使用它们。因为根本找不到切入点,找出我该如何入手,万事开头难。
编程本质就是一门技术,一门手艺活,最好有老师傅带着你,告诉你这部分你可以先完成,那部分你也可以先入手,一点一点的积累,从小部分做到整体,孰能生巧游刃有余。
但是很不幸,你的生活中不会有这样的老师傅,你需要靠自己寻找机会,我把这样的寻找机会的步骤分为三步:

* 疯狂的积累代码量,疯狂的刷题,疯狂的积攒你的自信心。
* 寻找实习,找到自己感兴趣的地方,跟着别人做,了解工业届到底在使用什么技术。
* 当你实习结束的时候,你将不会再对那些名词感到陌生,你有了一定的经验,你可以尝试独立的尝试用一些开源框架做一些简单的project。
具体该如何做呢?

* 当你还是一个新手的时候,你需要疯狂的积累你的代码量
,你可以从基本的问题出发,做一些简单的问题,怎么输入数据,怎么输出数据,然后熟悉各种数据结构,各种常见算法,疯狂的刷题,比如LintCode - Home
<https://link.zhihu.com/?target=http%3A//www.lintcode.com/>
就是一个很不错的刷题网站,不会怎么办!看答案,这里推荐一个找答案的网站:LeetCode / LintCode 答案查询
<https://link.zhihu.com/?target=http%3A//www.jiuzhang.com/solutions/> ,
了解怎么写,然后自己实现一遍。你可以先从easy难度的问题做起,每一个程序也就20-40行左右,甚至你可以一旦AC,反复提交,以增强自信心,虽然这只是一个玩笑,但是它可以让你提高你对编程的自信,对编程的喜爱,当你有自信的时候,你才能真正的把一件事情做好。当你反复解决一个又一个的问题的时候,你要告诉自己我是个天生的编程者!然后你就可以挑战更高难度的问题,当你积累到10W以上的代码量的时候,你会发现你会有一个质变。一切将变的顺手。当以前要想半天的语句,现在信手拈来。恭喜你跨出了很重要的一步。
* 你该去找实习了。当你有了第一步作为铺垫以后,你应该去业界提高你的编程能力
,这个很重要。什么是编程能力,用程序去解决真正的问题,你的程序写的更让人能读懂,这是编程能力,你的程序高效可维护,这是编程能力,你的程序被review的次数很少,质量很高,这是编程能力,你能快速理解一个小项目,小模块在做什么,怎么做的,这也是编程能力。所以你应该去公司,有mentor指导你的情况下,去做一些事情,参与到团队中去。同时实习生的面试门槛比Full
time会低很多,只要你把第一步做好了,好好的准备面试,拿到一个不错的实习也问题不大(实习生也更容易拿到return off)。
* 当你实习结束以后,做一下总结
,业界到底在干什么,业界使用的技术到底有哪些,他们平时的编程工具等等这些都是值得你学习的地方,你可以用你学到东西尝试着去做一些简单的project。你会发现原来毫无头绪的事情,慢慢变得清晰起来。疯狂的训练,超强的自信心,去工业界实习一下,你就会明白我要什么,我要为了我所想要的我该怎么做。
推荐阅读:

* CS 常考基础知识点
<https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzA5MzE4MjgyMw%3D%3D%26mid%3D2649455745%26idx%3D1%26sn%3D616956bdf8b0c5eced4cc65bc38d1810%26chksm%3D887e1289bf099b9f092842a249108b35b08c868a009f5dae00324d861d15917ae45e4352362e%26mpshare%3D1%26scene%3D1%26srcid%3D0317fzekHO78utdYA1dB4S7k%26key%3De10ebddae0f430006d78cd0b06dbbe2eb4c593294377ad624148e201cb0b707c5028a626ed6789afd12ad565958b73e837fd2e97a14d5502c74726cc10d7e8237dd36a6f20d2569e045b50cd948900b2%26ascene%3D0%26uin%3DMTUyMzg3NjAwMA%253D%253D%26devicetype%3DiMac%2BMacBookAir7%252C1%2BOSX%2BOSX%2B10.12.3%2Bbuild%2816D32%29%26version%3D12020010%26nettype%3DWIFI%26fontScale%3D100%26pass_ticket%3D0AiIToHJN8yqpuqRAsA5PaaQMJr8KtvlnZ2EqkX0zx%252BEZweRvHKyF%252ByjmycpUbVn>
* 九章算法原创干货,找码工、面试必看!
<https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzA5MzE4MjgyMw%3D%3D%26mid%3D2649456058%26idx%3D1%26sn%3Dfc54ac90751824d3fe9f28a2bcdeff7b%26chksm%3D887e13b2bf099aa463a837d7d1ba8b584831c3d14017a35b52b942ac03170630c93cc99ee92e%26mpshare%3D1%26scene%3D1%26srcid%3D03179HJjCRMW1m6W3OQnUq42%26key%3Df5df4d9450841b95fe304367c1a46ea0ae589bff1766b10133cbaa33e02289391f06b8a6ce8d3de253032d520541b8949a306f1c88501008c141ea593c797e3f23cfa83f6e73f6937fe42927899e7b0e%26ascene%3D0%26uin%3DMTUyMzg3NjAwMA%253D%253D%26devicetype%3DiMac%2BMacBookAir7%252C1%2BOSX%2BOSX%2B10.12.3%2Bbuild%2816D32%29%26version%3D12020010%26nettype%3DWIFI%26fontScale%3D100%26pass_ticket%3D0AiIToHJN8yqpuqRAsA5PaaQMJr8KtvlnZ2EqkX0zx%252BEZweRvHKyF%252ByjmycpUbVn>
欢迎关注我的微信公众号ninechapter,回复关键词”简历”、”career”、”评分”、”项目”...你就可以获得所有你想要的东西~



<https://www.zhihu.com/people/ling-long-xie-seng>
玲珑邪僧 <https://www.zhihu.com/people/ling-long-xie-seng>  公众号:万物情史/研发工程师/区块链

这题确实很大,很难讲得面面俱到,我便暂且从我个人经验和角度出发,希望能够起到抛砖引玉的效果,给诸位一些小小的建议。

目录(可按需进行定位阅读)

* 前言:明确编程的本质
* 必要的辅助工具与技能
* 明确学习的方向
* 选择合适的学习方式与方法
* 总结
0)前言:明确编程的本质


其实我们在小学时代解答应用题的时候,就已经逐步培养起将实际问题抽象建模、选择合适算法(例如加减乘除)进行求解的思维方式。当计算量巨大或者问题过于繁冗时,人工手算显然开始力不所能及,现代计算机便应运而生,自动化编程也成为了一种社会发展的必然趋势。

所以究起根本,编程即是将实际问题抽象为一种模型,再用一种高度逻辑化的语言,用特定的算法进行描述与实现。

1)必要的辅助工具与技能

学会使用git指令和github:


我大四时前往爱尔兰进行交流学习,教授ruby语言的老师专门用了整整一个学期,反复穿插地考察了我们git的掌握情况。刚接触的时候苦不堪言,常常一条错误的命令敲下去,写了三天的代码就能当场从爱尔兰回滚到中国。有好几次我都是在deadline前出了branch
merge的错——

不如连夜客死他乡。


但当我逐渐掌握git指令并学会使用github后,我才意识到github是多么牛逼的存在。作为全球最大的同性交友平台,github的版本控制功能和代码托管功能十分完善。特别是在实际工作场景里,一个多人的大型项目如何规避冲突和高效配合将成为首要重点。


对于初学者,学会如何使用github将会提供了一个良好的开端。养成不同功能的模块开发写在不同的branch上的习惯,能够使你的项目逻辑清晰并易于修改。如果你把所有的代码全部放在一起,一旦你写了层层嵌套的塔型狗屎(这是你一定逃脱不了的命运……),无法连根撤回的bug堆将会直接击碎你还没开始就已结束的编程梦想。

所以如果你想要学习编程,那么请现在就打开一个新的tab页,输入https://github.com
<https://link.zhihu.com/?target=https%3A//github.com>
,注册属于你的交友账号。初学的小朋友们也不要过于担心。这玩意儿虽然看起来有些复杂,但是相信我,它比看起来更特么复杂……不过不要畏难,要知道这点困难在你今后的编程生涯里,毛都不算……

相关教程:

github官方教程
<https://link.zhihu.com/?target=https%3A//guides.github.com/activities/hello-world/>
:https://guides.github.com/activities/hello-world/
<https://link.zhihu.com/?target=https%3A//guides.github.com/activities/hello-world/>


个人博客:https://github.com/phodal/github
<https://link.zhihu.com/?target=https%3A//github.com/phodal/github>;

菜鸟教程:http://www.runoob.com/git/git-tutorial.html
<https://link.zhihu.com/?target=http%3A//www.runoob.com/git/git-tutorial.html>;

选择一款合适的IDE:


挑选一款合适的IDE会使编程体验和效率大大提升。IDE即集成开发环境,是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和用户图形界面。不同的IDE可以适配不同的工作应用场景,例如:PHP:PhpStorm;web开发:WebStorm;Java:Eclipse,Intellij
IDEA;C、C++:Visual Studio ,Xcode;扩展性强的通用IDE:Sublime 2,Emacs,Vim;

建议右上角关闭:word和txt文本编辑器

sublime 2最易上手,虽然它是收费软件,但却可无限期试用……可谓良心代表

sublime 2下载地址:http://www.sublimetext.com/2
<https://link.zhihu.com/?target=http%3A//www.sublimetext.com/2>;

vim不建议新手使用,因为如果不明白操作指令,进入vim模式后你只能茫然地敲下若干随机字符串,然后关机以求解脱。。。

我曾偶然看过一部电视剧的片段,女主在一夜之间学会了Java,成功地编写并部署了一个大型项目,于第二天早上的凌晨五点钟,通过qq将代码以word文档
形式发给了甲方……

我至今都记得那是宋体。14号。加粗。方法名还是斜体。

在此我恳求我的编剧朋友们,今后若是涉及到编程相关领域的剧情编写,下笔之前请务必来问问我……

2)明确学习的方向

计算机编程领域的分类众多纷杂,不同的划分标准下有不同的开发方向。例如:

按编程语言划分:JAVA,Python,C/C++, Javascript,Ruby,PHP,etc.;

按开发平台划分:Web,IOS,Android,etc.;

按岗位职责划分:前端,后端,运维,测试(黑白盒),数据分析,网络安全,etc.;

按生物种类划分:独一无二的
@玲珑邪僧 <https://www.zhihu.com/people/39e1a1e41b3903f9283e13d11a39bbfd>,其他程序员。



对于之前没有任何编程相关经验的初学者,我的建议是不妨先学习前端相关语言(JS、HTML、CSS)。因为所谓前端开发,即致力于开发客户端上同用户最直接交互的界面,运行即见所得,初期基础项目环境部署相对简单,编译结果可视性强,相对于后端更容易获得最初阶段的满足感,并能获得可持续性发展的兴趣与坚持下去的动力。





随着前后端的逐步分离,MVC模式里的View和Controller逐渐都归纳于前端领域范畴,如何搭建一个易于维护、性能高效的前端代码框架是一个十分需要探索与钻研的事情,各类前端框架例如Angular、React、Vue也因此应运而生(但切记不可只依赖于框架而不打好原生js的基础)。另外务必打好结实的css基础,因为当你的产品经理进行哪怕一点点的需求变动,你就会深刻体会到什么叫牵一发而动全身。


当然,你若想从事后端开发也未尝不可,只是环境部署相对较为复杂,所需的知识基础也比较晦涩生僻,较易挫伤初学者的信心。毕竟每个想当程序员的初学者心里都住有一个上帝,希望的是随手一指便有光,而不是大手一挥一片黑,再动两下还塌方……

3)选择合适的学习方式与方法

* 若你是相关专业的在校学生,请务必:
1.学好所有相关的专业课程,无论它多么枯燥乏味。


你若不学计算机组成原理,你便不知道一个int型数据类型占4个字节是何物理意义,更不会透彻理解变量声明和变量定义的区别;你若不学数据结构,你便不知究竟该如何用最优的算法进行最优的深度优化。基础是重中之重,打好基础在工作后能让你甩开大部分同行一条街。

2.不要质疑老师让你阅读代码、抄写代码的意义。


我曾经对这样的学习方式一度十分嗤之以鼻,自负地认为简直不可理喻,但事实证明,你老师终归是你老师,这种做法一定有其存在的合理性。你能看懂的和你能写下的绝非是同种东西,一旦落笔便能知道,你很可能连静态局部变量和动态局部变量都没有彻底搞清。

例如:

int fun(int n){ static int f=1; f=f*n; return f; } void main(){ int i;
for(i=1;i<=10;i++) printf("fun(%d)=%d\n",i,fun(i)); }
static会直接导致输出结果是阶乘还是单纯的乘法算数。而如果你不自己敲一遍,你很可能会忽略这个关键词究竟存在与否。

总而言之,代码在任何时候都不要复制粘贴,请务必自己一点一点进行手写。

* 若你是某一特定领域内的初学者:
合理充分地利用网络资源,多维度多渠道结合学习,切忌初始便买上几本厚厚的砖头书,进行毫无针对性的泛读而不进行任何实操练习。


我个人比较喜欢查阅英文的教材和视频资料,表述更为简洁,在编程领域里其实也更为语义化。有关MOOC在线的争议向来较大,不过我个人而言,我是会首选英文MOOC平台进行较为系统学习。面对一个新的领域,明晰的总体脉络走向和精准的切入点,能比单纯的自我学习大幅提高效率。

各类国际化引进MOOC平台中相对成熟著名的有:Udacity,edX,
coursera等。不过单就计算机领域的MOOC教育来说,个人比较偏向选择Udacity。由于我最近准备着手转向机器学习正在学习python,故暂且以python入门的预览部分
https://cn.udacity.com/course/i
ntro-to-python-nanodegree-foundation--nd000-cn-python
<https://link.zhihu.com/?target=https%3A//cn.udacity.com/course/intro-to-python-nanodegree-foundation--nd000-cn-python>
(但似乎先需注册),可看出它的汉化工作较为完善。在初期,若是本身就已经看不懂代码了还特么听不懂人话,这足以让你写出一本python从入门到放弃……
第二点也是最重要的一点——存在code review这个环节——在此我要敲黑板强调:

请各位务必珍惜有人在你初期阶段便愿意帮你进行一对一的code review。

在初步学习阶段,其实有两件事情至关重要:

1.独立开发一个完整的项目;

2.有专业人员给予代码的审核指导(code review)。


我之前就职的公司,每天早上10点进行standup是雷打不动的规矩,我被我的reviewer当众吊打也成为特色表演节目之一……虽然被揪头发的感觉痛苦,但是各位务必要记住,一定要珍惜别人给你的review意见,也要多review别人的代码

——毕竟自己的代码自己怎么看都牛逼,只有互相揭穿对方的傻逼才能共同进步……

零基础初学者可以预览相关入门https://cn.udacity.com/course/i
ntro-to-programming-nanodegree--nd000-cn-basic
<https://link.zhihu.com/?target=https%3A//cn.udacity.com/course/intro-to-programming-nanodegree--nd000-cn-basic>
(似乎也需先注册),可以体会我所说的以前端为首要切入点、python作为后期配合的架构,与之前在第二章推荐的大致相同,较为合理。

另外,code review也是github的重要存在意义之一。团队项目里提交一个pull
request一般来讲是绝不允许自己合并到develop或master主支上的,需要有一个或一个以上的reviewer进行审批后才能确认merge。所以再重申一遍:一定要学会使用github。

此外较为知名的文本教程网站有:

w3school 在线教程
<https://link.zhihu.com/?target=http%3A//www.w3school.com.cn/index.html>,菜鸟教程
<https://link.zhihu.com/?target=http%3A//www.runoob.com/>;


w3school有思维导图(这点我认为很好),课程内容也较菜鸟更多,但是我之前更偏向用菜鸟,因为它的用户界面让我觉得比较简洁轻松,w3school相对显得有些庄严……(w3school:?

较为知名的刷题网站有:

lintcode:http://www.lintcode.com/zh-cn/
<https://link.zhihu.com/?target=http%3A//www.lintcode.com/zh-cn/>,

codepad:http://codepad.org/
<https://link.zhihu.com/?target=http%3A//codepad.org/>


当有一定的学习经验后,善用在线练习网站进行巩固便变得十分重要。所谓编程,重点在编。相信我,你所能犯的奇葩错误种类绝对超出你对自己的认知……如果不进行实操练习,你永远都不会知道哪个知识点你没有掌握周全。

较为知名的技术博客有:

vczh轮子哥:λ-calculus
<https://link.zhihu.com/?target=http%3A//www.cppblog.com/vczh>(C++方向)

赵劼:首页 - 老赵点滴 - 追求编程之美
<https://link.zhihu.com/?target=http%3A//blog.zhaojie.me/>(C++方向)
@路人甲 <https://www.zhihu.com/people/eaf435b228ce0b038a4afe8203f59b49> 学习编程
<https://zhuanlan.zhihu.com/passer>(Python、数据挖掘方向)
廖雪峰老师:https://www.liaoxuefeng.com
<https://link.zhihu.com/?target=https%3A//www.liaoxuefeng.com/>(前端、python方向)

当你遇到一个问题时切莫灰心慌张,你的坑肯定有前人帮你踩过,善于利用技术大牛的博客,会使你事半功倍。




一门编程语言怎么算入门:







如何快速掌握一门新的语言:



友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信