点击关注异步图书,置顶公众号
每天与你分享 IT好书 技术干货 职场知识
参与文末话题讨论,每日赠送异步图书
——异步小编
为什么说这不是一本完全C语言的书?因为《“笨办法”学C语言》不仅仅是一本书,随书附赠5个多小时充满激情的视频,这是一套完整的C语言视频课程!
这本书刚拿到样书,运营经理兴奋的发来消息:“手机扫码看视频,太方便了,速度也很快,配的字幕也很赞!”而本书的责编杨海玲老师很淡定:“这个是我尝试的第一本扫码看视频的书,虽然遇到些问题拖慢了流程,但感觉还是值得的”,听到这儿小编也忍不住体验一把,确实超级赞,而海玲老师也剧透:“笨办法学Python3也会是这个模式,目前正在视频审核和生成二维码,新版终于快出版了”,对于“笨办法”学系列的粉丝儿来说,无疑是又一个福利。
立即扫码体验吧
《“笨办法”学C语言》
大部分技术书籍都在教你一些具体的东西:某门语言、某种技术、某个框架、某个工具……你看完书,大致模拟演练一下,然后就可以把这样东西写在简历里。你把简历发给心仪的公司,就幸运地获得了一份新工作。你在新公司解决了一些技术问题,但也积累了一些技术债务。你解决的问题为你带来更多经验并铺平了你前进的道路,积累的债务你也不用担心,因为没过几年,你要么已经成功升职,没人敢让你还债,要么已经成功跳槽,没人能找到你还债了。
这就是每一名上进的程序员的上升之路,用一个时髦的词汇讲,这算得上个人成长的“增长黑客”之路。当然,等这本书出版的时候,这个词也许跟“给力”一样,被扫到互联网的垃圾堆里了。
这本书不是这样的,作者竟然找了一门“已经过时的编程语言”,来教你一些没法写在简历里的东西。作者疯了?
这本书的价值就是在于让初级水平的程序员也能写出牢靠可用的代码。沉下心打好基础,未来的路才会更顺畅。
这不是一本C语言
别觉得自己上当了,这本书其实并不是一本教你C语言编程的书。你会学到编写C语言程序,但这本书给你最重要的一课是严谨的防御性编程。现在有太多的程序员会天真地假设他们写的东西没问题,但却总有一天,灾难性的失败会发生在这些东西上面。如果你主要学习和使用的都是现代编程语言来解决问题,那你尤其会碰到这种情况。阅读了这本书,并跟着做了里边的习题,你就会学会怎样写出有自卫能力的程序,它们可以防卫自己不被恶意行为和自身缺陷所伤害。
我使用C语言有一个很特别的原因:C是一门“烂”语言。
C语言有很多设计选择在20世纪70年代还算颇有意义,但放到今天则毫无道理。从毫无限制到处乱用的指针,到严重没法用的NUL结尾的字符串,这些东西是C程序几乎所有安全缺陷的罪魁祸首。尽管C语言用途广泛,但我相信C语言之烂,它是最难写出安全代码的一门语言。我猜就连汇编语言都比C语言更容易写出安全代码。说句心底的大实话,我觉得大家都不该再写新的C代码了。既然这样, 那为什么我还要教你C语言呢?因为我想要让你成为一个更好、更强大的程序员。如果你要变得更好,C语言是一个极佳的选择,其原因有二。首先,C语言缺乏任何现代的安全功能,这意味着你必须更为警惕,时刻了解真正发生的事情。如果你能写出安全、健壮的C代码,那你就能用任何编程语言写出安全、健壮的代码。你在这里学到的技术,可以应用到今后你用到的任何编程语言中。其次,学习C语言让你能直接接触到如山似海的旧代码,还能教会你众多衍生语言的基本语法。一旦学了C语言,你学习C++、Java、Objective-C和JavaScript也就更容易,就连一些别的语言也会变得更加易学了。告诉你这些不是为了把你吓跑,作者计划把这本书写得非常有趣、简单而且“离经叛道”。会给你一些用别的语言也许很少会去做的项目,通过这种方式让你从中获得乐趣。会用我百试不爽的习题模式,让你学习C语言编程并且慢慢增强自己的能力,这种方式会让你觉得这本书很好上手。还会教你怎样破坏程序以及怎样让你的代码变得更安全,让你知道为什么这些事情很重要,这种方式可以说是相当的“离经叛道”。你将学会怎样导致栈溢出和非法内存访问,了解众多C程序中常见的缺陷,最终知道自己面对的究竟是什么。
像我的所有书一样,这本书的通关很有挑战性,不过如果你真的通关了,那会成为一名更好且更自信的程序员。
未定义行为
我写代码时会试图避免未定义行为,避免的方法就是让我写的代码要么不触发未定义行为,要么能防止未定义行为。后来我发现这是一个不可能的任务,因为未定义行为实在太多了,到处都是各种互相关联的陷阱,形成一个难解的戈耳狄俄斯之结。在你学习这本书的过程中,我会指出各种你会触发未定义行为的方法,告诉你可能的话该如何避免,以及如何在别人的代码中触发可能的未定义行为。不过你应该记住,要完全避免未定义行为这种带着近乎随机性质的东西是几乎不可能的,你也只能尽力而为。
C既美丽又丑陋
未定义行为的存在,是你学习C语言的又一个理由,如果你想成为一名更好的程序员,这会对你很有帮助。如果你能用我教你的方法写出良好稳固的C代码,那你就能应付任何语言。C语言还有积极的一面,它在很多方面都是一门真正优美的语言。尽管它功能强大,语法却简单到令人难以置信。在差不多45年里,众多语言都复制了C语言的语法,这不是没有原因的。C语言会给你提供很多,使用到的技术却极少。学完C语言后你会发现,这门语言既优雅美丽,同时又有几分丑陋。C语言很老了,它就像一块纪念碑,远看雄伟壮丽,近看会有很多的裂缝和缺陷。
我知道我用的C挺稳固,因为我花了20年撰写整洁、稳固的C代码,它们支撑了大型程序的运作,而且基本没怎么出过问题。我的C代码支撑了Twitter和Airbnb等公司的业务,这些代码也许已经处理过数万亿个事务。它们极少出问题或受到安全攻击。在许多年里我的代码都支撑着Ruby on Rails的Web世界,它一直运行完美,甚至还防止过安全攻击,而别的Web服务器程序常被各种简单的攻击攻陷。
我的C代码编写风格是很稳固的,不过更重要的是我写C代码时的意识状态,这应该是每一个程序员都应具备的东西。我在着手C语言或者任何别的编程语言时,会时刻想着尽可能预防错误的发生,并且会带着凡事皆不会顺利的想法。别的程序员,就连那些据说很厉害的程序员,也会在写代码时假设一切顺利,而后则需要依赖未定义行为或操作系统来拉自己一把,这二者作为解决方案都是不及格的。你只需要记住,如果有人告诉你,说我在这本书里教你的不是“真正的C语言”,那么你可以考察一下他们的编程历史,如果他们的纪录没我这么好,那么没准儿你还可以用我教你的方法,给他们展示一下为什么他们的代码安全性不太好。
那么是不是我的代码就完美了呢?当然不是。这可是C代码。写出完美的C代码是不可能的,其实用任何语言写出完美的代码都是不可能的。编程的乐趣和烦恼,有一半都和这一点有关。
我可以把别人的代码批得一文不值,别人也可以把我的代码贬得一无是处。所有的代码都是有缺点的,但我假设自己的代码总有缺陷,然后去避免这些缺陷,那么事情就不一样了。如果你学完了这本书,我给你的礼物就是教会你防御性编程的思维模式,这种意识在20年里为我带来了不少好处,让我写出了高质量、健壮的软件。你会学到的东西
- 基本的C语法和习惯写法;
- 编译、Makefile和链接器;
- 找出bug,防止它们发生;
- 防御性编程实践;
- 破坏C代码;
- 撰写基本的Unix系统软件。
等你完成了最后一个习题,你将会拥有充足的“弹药”,用来应对基本的系统软件、库以及别的小型项目。
怎样阅读本书
本书针对的是至少学过一门编程语言的人。如果你还没学过编程语言,我建议你通过我的《“笨办法”学Python》(Learn Python the Hard Way)开始学习,它是一本专为初学者写的书,是一本非常有效的编程入门书。读过《“笨办法”学Python》以后,你就可以开始看这本书了。
对于已经学过编程的人来说,本书一开始也许看上去有些奇怪。别的书里边会有大段大段的讲解,然后让你时不时写一点儿代码。这本书不一样,每一个习题都有视频讲解,你一上手就要输入代码,然后我再向你解释你输入的内容。这种形式更为有效,因为用抽象的形式解释你不熟悉的东西你会很难理解,而如果你已经做过了一次,我解释起来就更为容易了。
先看视频,除非习题中另有指示。
录入所有代码。禁止复制粘贴!
一字不差地录入代码,连注释也要一模一样。
运行代码,确保输出相同。
如果有缺陷,就修正它们。
做附加练习,不过如果遇到弄不清楚的东西,跳过去也没关系。
遇到问题先自己想办法解决,然后再求助。
如果你遵守这些规则,照着书里的内容去做了,最后还没有学会编写C代码,那么至少你已经尝试过了。C语言并不适合每一个人,但尝试的过程会让你成为一个更好的程序员。
5小时视频
我建议你先看视频再做习题,除非我另有指示。在有的习题中,我使用一个视频演示问题,再用另一个视频来演示解决方案。在另外的大部分习题中,我使用视频作为讲座,然后你完成练习,弄懂课题。
关键技能
我猜你是从一门菜鸟语言来到这里的(我只是在调侃而已,你应该看得出来)。要么你来自像Python或者Ruby这样“还算能用”的语言,这些语言让思维不清、半吊子、瞎鼓捣的人也能写出能运行的程序来;要么你用过Lisp这样的编程语言,这些编程语言假装计算机是某个纯函数的仙境,四周还装了五彩的婴儿墙;要么你学过Prolog,因而认为整个世界应该只是一个供你上下求索的数据库。更糟糕的还在后面,我打赌你还用过某个集成开发环境(integrated development environment,IDE),所以你的脑子充满里记忆空洞,如果你不是每敲3个字符就按一次Ctrl+Space的话,我怕你连一个完整的函数名称都敲不出来。
- 读写能力
如果你平时使用IDE的话,尤其如此。不过大体来说我发现程序员略读的时候太多了,从而导致理解性阅读能力有些问题。他们将代码扫视一遍就觉得自己读懂了,其实不然。其他编程语言还提供了各种工具,从而避免让程序员直接撰写代码,所以一旦面对C这样的编程语言,他们就立马崩溃了。最简单的办法就是要理解每个人都有这样的问题,解决方案就是强迫自己慢下来,更加细致地去读写代码。一开始你也许会觉着很痛苦、很烦躁,那就增加自己休息的频率,最后你会觉得这其实也很容易做到。
- 关注细节
这方面没有人能做得好,这也是产生劣质软件的最大成因。其他编程语言会让不够专注的你蒙混过关,但C语言却要求你完全聚精会神,因为C语言直接和计算机打交道,而计算机又是极其挑剔的。在C的语境中没有“有点儿像”或是“差不多”这样的说法,所以你需要专注。反复检查你的工作。在证明正确之前,要先假设一切都可能是错的。
- 发现差异
用过其他编程语言的程序员有一个问题,就是他们的大脑已经被训练成可以发现那种语言中的差异,而不是C语言中的差异。当你在对比你的代码和标准答案时,你的视线会直接跳过那些你认为不重要或不熟悉的部分。我给你的解决办法是:强迫自己观察自己的错误,如果你的代码跟本书中的代码不是一字不差,那它就是错的。
- 规划和除错
我喜欢其他更简单的编程语言,因为我可以“胡搞乱来”。我把想法敲出来,然后就能直接在编译器里看到结果。这些语言可以让你很方便地尝试新的想法,但你有没有发现:如果你一直用“乱改直到能用”的方法写代码,到头来就是什么都不能用了。C语言对你要求比较高,因为它要求你先计划好要创建的东西。当然你也可以偶尔胡乱弄弄,但和其他编程语言相比,你需要在更早的阶段就开始认真做计划。在你写代码之前,我会教你如何规划程序的关键部分,希望这能同时使你成为一个更优秀的程序员。即使是很小的计划也能让你的后续工作更为顺利。
在学习C语言的过程中,你将被迫更早、更多地应对这些问题,所以学习C语言更能让你成为一名更好的程序员。你不能对自己写的东西思维不清,否则什么都不会做出来。C语言的优势是,作为一门简单的语言,你可以自己把它弄明白,因此如果你要学习机器的工作原理,并增强这些核心的编程技能的话,C语言是上佳的选择。
《“笨办法”学C语言 》
[美] 泽德 A. 肖(Zed A. Shaw) 著
点击封面购买纸书
作者Zed A.Shaw为急于自我提高编程技能(不限语言)的C语言初学者构建了一套完美的课程,只要跟着学,你就会像迄今为止Zed教过的数百万程序员一样获得成功!只要你能自律、投入和坚持!
在本书中,你将通过完成52个精心设计的习题来学会C语言。阅读书里的习题,看作者提供的视频,照着录入代码(不要复制和粘贴!),修正自己的错误,观察程序的运行。在这个过程中,你将会了解好的现代C代码长什么样子,如何有效地思考代码,如何更加有效地找出和修正错误。最重要地是,你将掌握严密的防御性编程技术,不管你使用什么编程语言,利用这些技术你都可以创建避免缺陷并抵御恶意行为的软件。本书通过实用的项目,让你学以致用,从而对自己新学会的技能更有信心。Zed将教会你编写出色的C代码所需具备的诸多关键技能。
今日话题
说说你对C语言的看法?截止时间4月16日17时,留言+转发本活动到朋友圈,小编将选出3名读者赠送异步新书一本。
延伸推荐
2018年2月新书
2018年1月重磅新书
小学生开始学Python,最接近AI的编程语言:安利一波Python书单
政策升温:大家都在学大数据,一大波好书推荐
8本新书,送出一本你喜欢的
AI经典书单| 入门人工智能该读哪些书?
长按二维码,可以关注我们哟
每天与你分享IT好文。
在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!
点击阅读原文,购买《“笨办法”学C语言》
阅读原文