唐磊的个人博客

经验分享 —— 程序员编程如何入门、进阶

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader。欢迎关注,交流和指导!

本文首发于微信公众号,原文链接,转载请全文保留。后台回复关键字 “1024” 获取程序员大厂面试指南。

背景

在上一篇文章中,石头哥谈了谈读本科的时候都学了哪些计算机专业课和推荐了一些经典的技术书籍,然后推文封面中的这张图引起了不少读者的注意。

图:石头哥课程大作业 Demo

这其实是我当时的课程大作业的 Demo,(严格意义上讲其实是几个课程的大作业😎)。

今天这篇文章, 石头哥就接着这个话题讲讲我是如何入门和进阶编程的。也正好有读者朋友跟我咨询,有没有什么 Java 小项目可以练手的,这篇文章也算是能回答这部分读者的疑问。

下面,我将从以下这几个方面,谈谈自己的理解:

目录

如何入门、提高兴趣?

首先,“编程”的门槛相对较低,你看外面的培训机构早就从成年人延伸到越来越多的中小学生,甚至“少儿编程”了。既然“少儿”都学,难道你还不能学么?

但整体来讲学习“编程”,特别是到后面进阶(例如数据结构和算法),是相对比较枯燥的。所以就要想办法来提高自己的兴趣,或者说通过一步步学习来获得“成就感”反向刺激自己主动多学习。

关于入门的编程语言,我觉得不要太局限,不要太限制自己非得用某个语言入门,可以根据自己的实际情况来选择。不过整体来讲,如果之前完全是小白,我推荐比如用 Python 等先对编程语言有个大体的了解。

掌握了一门编程语言后,其他语言都是触类旁通的,无外乎就是“顺序、选择、循环”,不同编程语言的具体语法不一样而已。然后对于常规的面向过程的 C 语言,或者面向对象的 Java 等也建议都了解和学习一下。

记得我当初上大学的时候接触的第一门编程语言就是“VB”,我想学校安排的课程先后顺序还是很有道理的。用 VB,在 VisualStudio 上简单用鼠标拖一拖就能出来一个有用户界面、可交互的像模像样的“软件”,这对于上面提到的用“成就感”来激励自己主动多学习还是很有效果的。

比如当初课程大作业就是写一个计算器,通过短时间的入门学习,就能写一个这样的计算器软件出来,确实还是颇有成就感。这其实就跟现在的少儿编程一个道理,用一些可视化的编程平台让小朋友通过简单的拖拽,加上少部分逻辑就能出一个非常“炫丽”的效果,就跟玩游戏一样,这当然能激发足够的兴趣。

再比如刚开始入门就选择 C 语言或者汇编,这对于提高兴趣、想获得“成就感”来起到激励作用就大打折扣了。我记得当初课程学习 C 语言时,最后作业都只有在黑屏控制台下,虽然也能完成差不多的功能,但从“可观赏性”来讲就差太多了。当然,我不是说 C 语言不重要哦~ C 语言还是很经典的,入门一门语言后,建议都认真学学。

小结一下,入门编程,就是先学一门比较好上手的编程语言,通过尝试写一些有用户界面(比如 HTML+JS)的小项目、小 Demo 来激励自己。

积累专业知识,重视基础

有了一两门编程语言作为基础后,这个环节就是真正体现编程水平的时候,也是最能和其他人拉开差距的部分。

在阿里社招面试的过程中也是非常看重基础的,过去项目不牛 X 没关系,基础知识一定得杂实。

石头在参与社招面试过程中,领导也特别交代,除了一般的沟通交流外一定要看基础,基础好,解决问题时有逻辑、有条理,简单的代码题目能写个八九不离十,基本上一面二面也就过了。

具体相关的计算机专业课程无外乎就是那么几门:《C/C++程序设计基础》、《数据结构》、《算法分析和设计》、《汇编语言程序设计》、《计算机网络》、《操作系统》、《数据库系统》、《编译原理》等等,在这里我也不再详述了,感兴趣的同学可以参考下我之前写的这篇文章 1024程序猿节,聊聊石头学了哪些课,屯了哪些书?

从中可看出,正如我之前所说,计算机相关的专业基础知识和就业联系得很紧密。如果是在校生,就一定不要浪费时间、抓住这些专业课程的学习机会。不然毕业后从事了编程这个行业,也还是会回到这些基础知识上,正所谓“欠下的债,迟早都是要还的”。

况且,学校的课程学得好,还能帮助获得奖学金、保研、找工作等等,一举多得,简直完美。

再次强调一下,程序猿真的需要重视基础,我在之前的文章中也多次强调了,比如 《有了这份程序员面试指南,你离大厂Offer还远吗?》《从一道面试题谈谈一线大厂码农应该具备的基本能力》

现在的网络资源也很丰富,各种丰富的教程、文章、书籍等都可以直接白嫖,比如肝王 cxuan 总,小林的图解系列等等都很不错。比起我们当年,真是要好太多了。不过也正是因为现在各种资料满天飞,其中也不乏各种垃圾,学会甄别和如何快速检索到想要的也是一种能力。

当然,还有一点也很重要,很多情况下,我们去屯了不少学习资料,然而真正去阅读学习的又占多少?我不知道你怎么样,反正我确实是屯了不少,但屯了后去认真看的,确实少。

积攒项目经验

前面提到的入门也好,基础知识也好,其实最终是为“项目”、为“产品”服务的。在校生或者刚入门没有“项目”,没有“产品”怎么办,那就自己制造机会。

为什么要做项目呢,因为一个完整的项目是可以比较系统的,是一个可以把理论付诸实践的机会,从某种程度上讲,做一个或大或小的项目,也能起到跟前文所说的正向激励的作用。

例如我在本科期间,就做了几个小项目,现在列举两个典型供大家参考。

例如,学完 Java 编程、数据库等课程后,是不是也可以自己来搞个小聊天工具呢?再比如,学了 Java Web 开发,是不是可以搞个类似的图书管理系统、校园 SNS 之类(当初人人网很🔥啊)的玩玩?

下面就来看看我上学期间搞的两个小项目吧,供参考。

仿QQ聊天系统

这个就能对自己的学习有一个阶段性、系统性的总结,在当初看来确实还是蛮有成就感的。其实做一个,各种场合都能用,比如课程 A 的大作业可以用,稍微改吧改吧,课程 B 的也能接着用,一举多得。用心做,不仅自己知识点 get 到了,各个课程作业又能得高分。😑

这个系统主要是仿照QQ聊天软件,其功能模块包括:私聊、群聊、语音聊天、视频聊天,用到的主要技术点:C/S 体系结构,Oracle数据库、socket、多线程、swing等等。

当初做完了语音、视频聊天,还是很让人眼前一亮的。当然这种小项目当初我们是几个小伙伴一起合作完成的,一般课程作业是需要在规定的时间内完成的,就可以找几个小伙伴一起学习、互相促进和成长。

你当然也可以独立完成,如果也想找小伙伴一起,也可以加入”程序猿石头”的读者交流群,找志同道合的小伙伴一起“刷项目”,共同成长、共同进步。

积攒项目经验-传送文件

积攒项目经验-传送文件

看截图,是不是还像模像样的。用这个小项目来入门练手,还真是个不错的选择。有足够的挑战,同时也有足够的趣味性和成就感。

基于中国移动飞信的校园资讯网

这个项目是基于WEB网络的校园资讯网,项目分析了飞信协议(其实就是利用网络资源改写一个web飞信),利用飞信功能可以进行个人日程提醒、订阅天气、好友生日提醒、课程提醒等等;(时光荏苒,飞信?用过的说明你也“老”了)

主要技术点:项目采用Struts+Hibernate框架开发,httpclient+htmlparser分析教务管理系统流程获取有用信息,利用webservices获得谷歌天气信息,将这些有用信息通过飞信发送给用户。

登录飞信-官方飞信客户端被 T 出

登录飞信-官方飞信客户端被 T 出

这个小项目也是源于生活。当初当了个小班长,每期末都要统计成绩,计算综合测评等,想想,何不写个爬虫来爬呢。有时候,程序猿的“懒”就是为了提高效率。

爬虫-爬取课表和成绩

爬虫-爬取课表和成绩

类似的小项目可以达到阶段性总结的目的,同时自己的积累和总结也是自己的一笔财富,且无形之中可以让自己将来也获益。

举个🌰例子,比如我上面的项目总结和积累,可以帮助我后面获取更多的机会,例如当初我搞了个小团队,参与了大学生创新性实验项目,获得了国家 2 万元的项目研究资助,还发了小论文(虽然现在看来很水),后期在简历中也有加分。比如在我大三的时候,就获得了腾讯的实习机会,参与了真正的商业产品的开发。再后来,前面的积累又帮助我全奖保研到清华读研(清华录取外校的学硕名额是相当少的)。

勤思考、多总结

这个其实不必多说。不管那个行当,做到 “勤思考、多总结” 百利无一害。我在《10 年 bloger 告诉你要不要写博客,又该如何优雅地写博客?》 这篇文章中也提到了,我其实当初最初玩 blog,更多的就是抱着学习总结的态度。

例如,下图是我在读本科和硕士期间相关课程的学习材料,包括老师课件,课程作业和学习笔记和复习资料等,这种平日积累总结很有效,对于临近期末考试也能做到不慌不乱,还是很有作用的。

课程笔记总结

哪怕正式工作之后,写周报、月报等也都是阶段性的总结,再比如晋升答辩等等都是需要你日常的思考积累和总结的。反正将来都会用得着,何不现在就开始锻炼呢。

在日常学习和工作之中,我们看到一个问题的时候,要学会思考背后的道理,比如在接到某个需求的时候,思考这个需求最终是要解决具体什么问题,有没有更好的解决方案?在阅读某段代码,思考原作者为什么要这么设计?

就比如看到这段代码,你能否多思考一下其中的奥秘?

public static boolean isEqual(byte[] digesta, byte[] digestb) {
if (digesta == digestb) return true;
if (digesta == null || digestb == null) {
return false;
}
if (digesta.length != digestb.length) {
return false;
}

int result = 0;
for (int i = 0; i < digesta.length; i++) {
result |= digesta[i] ^ digestb[i];
}
return result == 0;
}

上述代码中,比较两个字符串是否相等,按道理,其实中间某位不相等就可以直接返回了,但为啥要遍历完了再返回,这么做的目的是什么?在问了为什么之后,你可能就会知道,原来这么做是为了防止计时攻击。完整文章可参考本人写的这篇文章——《这 10 行比较字符串相等的代码给我整懵了,不信你也来看看》

总结

整体来讲,针对“入门进阶编程”这个话题,我谈了谈自己的理解,重点还是要重视基础,通过小项目正向激励自己多主动学习,然后做到勤思考,多总结。

最后,求关注,本号会定期分享一些技术干货、职场经验等,如果大家对阿里或者其他大厂感兴趣,也可以找我内推,我可以帮忙提供简历 review 等,希望能和大家积极交流讨论,一起学习、共同进步。

觉得本号分享的文章有价值,记得添加星标哦。周更很累,不要白 piao,需要来点正反馈,安排个 “一键三连”(点赞、在看、分享)如何?😝 这将是我持续输出优质文章的最强动力。

关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader,欢迎关注,交流和指导!

欢迎扫码加入互联网大厂内推群 & 技术交流群,一起学习、共同进步。后台回复关键字 “0” 送阿里技术大礼包。

tanglei wechat
欢迎扫码加入互联网大厂内推群 & 技术交流群,一起学习、共同进步