跟着数百万人编程导师学C语言!

点击关注 异步图书,置顶公众号

每天与你分享 IT好书 技术干货 职场知识​

​​参与文末话题讨论,每日赠送异步图书

——异步小编

为什么说这不是一本完全C语言的书?因为《“笨办法”学C语言》不仅仅是一本书,随书附赠5个多小时充满激情的视频,这是一套完整的C语言视频课程! 

这本书刚拿到样书,运营经理兴奋的发来消息:“手机扫码看视频,太方便了,速度也很快,配的字幕也很赞!”而本书的责编杨海玲老师很淡定:“这个是我尝试的第一本扫码看视频的书,虽然遇到些问题拖慢了流程,但感觉还是值得的”,听到这儿小编也忍不住体验一把,确实超级赞,而海玲老师也剧透:“笨办法学Python3也会是这个模式,目前正在视频审核和生成二维码,新版终于快出版了”,对于“笨办法”学系列的粉丝儿来说,无疑是又一个福利。​​​

​立即扫码体验吧

《“笨办法”学C语言》作者泽德 A. 肖(Zed A.Shaw) 是一位狂热的吉他手、程序员和编程书作家。他的书教会了世界各地的上百万人如何编写软件。他的《笨办法学Python》和《笨办法学 Ruby》(这两本书都已出到第3版)在全球拥有数百万读者。他编写的软件大大 小小的企业都在使用。他的文章经常被众多极客圈的人阅读和引用。他是一位活 跃而有趣的作家,他会让你大笑,也会让你思考。 

大部分技术书籍都在教你一些具体的东西:某门语言、某种技术、某个框架、某个工具……你看完书,大致模拟演练一下,然后就可以把这样东西写在简历里。你把简历发给心仪的公司,就幸运地获得了一份新工作。你在新公司解决了一些技术问题,但也积累了一些技术债务。你解决的问题为你带来更多经验并铺平了你前进的道路,积累的债务你也不用担心,因为没过几年,你要么已经成功升职,没人敢让你还债,要么已经成功跳槽,没人能找到你还债了。

这就是每一名上进的程序员的上升之路,用一个时髦的词汇讲,这算得上个人成长的“增长黑客”之路。当然,等这本书出版的时候,这个词也许跟“给力”一样,被扫到互联网的垃圾堆里了。

这本书不是这样的,作者竟然找了一门“已经过时的编程语言”,来教你一些没法写在简历里的东西。作者疯了?

其实这本书和作者的其他书一样,表面上是在教你编程语言,实际上是在教你编程的思维方式和最佳实践这些东西在学校的课堂里讲得不多,市面上的书籍讲这个的就更少。工作时间长了,你也许会遇到一种人,他们技术水平似乎挺不错,很多东西都能讲出些门道,但写的代码质量却不太理想。这样的人,也许就是缺了这么一课。这一课很多人都是在工作实战中通过栽跟头补上的,但是现在你可以通过这本书补上。

这本书的价值就是在于让初级水平的程序员也能写出牢靠可用的代码。沉下心打好基础,未来的路才会更顺畅。

这不是一本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语言,也能学到如何正确使用它,但官方C语言并不是非常安全。大多数的C程序员写的代码并不稳固,其原因就在于一个叫未定义行为(undefined behavior,UB)的东西。未定义行为是美国国家标准组织(ANSI)的C语言标准中的一部分,这部分罗列了编译器能忽略你写的代码的所有方法。这份标准里真的有这么一块内容,里边写着如果你这么写代码,那么编译器就不和你玩了,它的行为就会变得不可预测。当C程序读到字符串的结尾,就会发生未定义行为,这是C语言中极其常见的一种错误。再来讲点背景吧,C语言将字符串定义为以NUL字节(为简化定义,可称为0字节)结尾的内存块。由于很多字符串都是来自程序之外,C程序会经常接收到不包含NUL字节的字符串。当发生这种情况的时候,C程序会越过字符串结尾接着读下去,读到计算机的内存中去,从而导致程序崩溃。C语言之后的每一种语言都试图避免这种情况的发生,但C却是个例外。C语言自己几乎完全不会预防未定义行为,而似乎每一个C程序员都认为这意味着他们无须应付这件事情。他们写的代码里充满了NUL字节越界的潜在可能性,当你指出这些地方以后,他们会说:“不就是未定义行为嘛,没必要费劲儿预防的。”这种对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语言技能,从而可以自己写软件,或者修改别人的C代码。学完这本书以后,你应该去阅读Brian Kernighan和Dennis Ritchie的《C语言编程设计(第2版)》,英文书名为C Programming Language, Second Edition,这是C语言发明者写的一本书,又称作K&R C。我将教会你的是以下内容:

  • 基本的C语法和习惯写法;
  • 编译、Makefile和链接器;
  • 找出bug,防止它们发生;
  • 防御性编程实践;
  • 破坏C代码;
  • 撰写基本的Unix系统软件。

等你完成了最后一个习题,你将会拥有充足的“弹药”,用来应对基本的系统软件、库以及别的小型项目。

怎样阅读本书

本书针对的是至少学过一门编程语言的人。如果你还没学过编程语言,我建议你通过我的《“笨办法”学Python》(Learn Python the Hard Way)开始学习,它是一本专为初学者写的书,是一本非常有效的编程入门书。读过《“笨办法”学Python》以后,你就可以开始看这本书了。

对于已经学过编程的人来说,本书一开始也许看上去有些奇怪。别的书里边会有大段大段的讲解,然后让你时不时写一点儿代码。这本书不一样,每一个习题都有视频讲解,你一上手就要输入代码,然后我再向你解释你输入的内容。这种形式更为有效,因为用抽象的形式解释你不熟悉的东西你会很难理解,而如果你已经做过了一次,我解释起来就更为容易了。

由于本书结构独特,你必须在学习时遵守几条规则。

先看视频,除非习题中另有指示。

录入所有代码。禁止复制粘贴!

一字不差地录入代码,连注释也要一模一样。

运行代码,确保输出相同。

如果有缺陷,就修正它们。

做附加练习,不过如果遇到弄不清楚的东西,跳过去也没关系。

遇到问题先自己想办法解决,然后再求助。

如果你遵守这些规则,照着书里的内容去做了,最后还没有学会编写C代码,那么至少你已经尝试过了。C语言并不适合每一个人,但尝试的过程会让你成为一个更好的程序员。

5小时视频

本书为每一个习题都配了视频,很多情况下一个习题会包含多个视频。这些视频至关重要,能让你完全领会本书的教学方法。这样做是因为撰写C代码的很多问题都是交互问题,交互的对象是失败、调试、命令等东西。Python和Ruby这样的编程语言中,代码要运行就运行了。C语言中要让代码运行,要修正问题,需要的交互要多得多。有些话题用视频讲解也更容易,比如指针和内存管理,在视频中我可以演示机器真正是如何工作的。

我建议你先看视频再做习题,除非我另有指示。在有的习题中,我使用一个视频演示问题,再用另一个视频来演示解决方案。在另外的大部分习题中,我使用视频作为讲座,然后你完成练习,弄懂课题。

关键技能

我猜你是从一门菜鸟语言来到这里的(我只是在调侃而已,你应该看得出来)。要么你来自像Python或者Ruby这样“还算能用”的语言,这些语言让思维不清、半吊子、瞎鼓捣的人也能写出能运行的程序来;要么你用过Lisp这样的编程语言,这些编程语言假装计算机是某个纯函数的仙境,四周还装了五彩的婴儿墙;要么你学过Prolog,因而认为整个世界应该只是一个供你上下求索的数据库。更糟糕的还在后面,我打赌你还用过某个集成开发环境(integrated development environment,IDE),所以你的脑子充满里记忆空洞,如果你不是每敲3个字符就按一次Ctrl+Space的话,我怕你连一个完整的函数名称都敲不出来。

不管背景如何,你都可能有以下4样技能有待提高。

  • 读写能力

如果你平时使用IDE的话,尤其如此。不过大体来说我发现程序员略读的时候太多了,从而导致理解性阅读能力有些问题。他们将代码扫视一遍就觉得自己读懂了,其实不然。其他编程语言还提供了各种工具,从而避免让程序员直接撰写代码,所以一旦面对C这样的编程语言,他们就立马崩溃了。最简单的办法就是要理解每个人都有这样的问题,解决方案就是强迫自己慢下来,更加细致地去读写代码。一开始你也许会觉着很痛苦、很烦躁,那就增加自己休息的频率,最后你会觉得这其实也很容易做到。

  • 关注细节

这方面没有人能做得好,这也是产生劣质软件的最大成因。其他编程语言会让不够专注的你蒙混过关,但C语言却要求你完全聚精会神,因为C语言直接和计算机打交道,而计算机又是极其挑剔的。在C的语境中没有“有点儿像”或是“差不多”这样的说法,所以你需要专注。反复检查你的工作。在证明正确之前,要先假设一切都可能是错的。

  • 发现差异

用过其他编程语言的程序员有一个问题,就是他们的大脑已经被训练成可以发现那种语言中的差异,而不是C语言中的差异。当你在对比你的代码和标准答案时,你的视线会直接跳过那些你认为不重要或不熟悉的部分。我给你的解决办法是:强迫自己观察自己的错误,如果你的代码跟本书中的代码不是一字不差,那它就是错的。

  • 规划和除错

我喜欢其他更简单的编程语言,因为我可以“胡搞乱来”。我把想法敲出来,然后就能直接在编译器里看到结果。这些语言可以让你很方便地尝试新的想法,但你有没有发现:如果你一直用“乱改直到能用”的方法写代码,到头来就是什么都不能用了。C语言对你要求比较高,因为它要求你先计划好要创建的东西。当然你也可以偶尔胡乱弄弄,但和其他编程语言相比,你需要在更早的阶段就开始认真做计划。在你写代码之前,我会教你如何规划程序的关键部分,希望这能同时使你成为一个更优秀的程序员。即使是很小的计划也能让你的后续工作更为顺利。

在学习C语言的过程中,你将被迫更早、更多地应对这些问题,所以学习C语言更能让你成为一名更好的程序员。你不能对自己写的东西思维不清,否则什么都不会做出来。C语言的优势是,作为一门简单的语言,你可以自己把它弄明白,因此如果你要学习机器的工作原理,并增强这些核心的编程技能的话,C语言是上佳的选择。

​《“笨办法”学C语言 》

[美] 泽德 A. 肖(Zed A. Shaw) 著

点击封面购买纸书


本书会随书附赠5个多小时充满激情的视频这是一套完整的C语言视频课程! 
作者Zed A.Shaw为急于自我提高编程技能(不限语言)的C语言初学者构建了一套完美的课程,只要跟着学,你就会像迄今为止Zed教过的数百万程序员一样获得成功!只要你能自律、投入和坚持! 
本书内容十分浅显易读,只要花2天到1周就可以读完,读完后既可以获得几千行代码的C编程经验本书会让你的每一分钟投入都有回报。你很快就能学会世界上最强大的编程语言之一,成为一名C程序员。 
在本书中,你将通过完成52个精心设计的习题来学会C语言。阅读书里的习题,看作者提供的视频,照着录入代码(不要复制和粘贴!),修正自己的错误,观察程序的运行。在这个过程中,你将会了解好的现代C代码长什么样子,如何有效地思考代码,如何更加有效地找出和修正错误。最重要地是,你将掌握严密的防御性编程技术,不管你使用什么编程语言,利用这些技术你都可以创建避免缺陷并抵御恶意行为的软件。本书通过实用的项目,让你学以致用,从而对自己新学会的技能更有信心。Zed将教会你编写出色的C代码所需具备的诸多关键技能。

“笨办法学系列”

​今日话题

说说你对C语言的看法?截止时间4月16日17时,留言+转发本活动到朋友圈,小编将选出3名读者赠送异步新书一本。

延伸推荐

2018年2月新书

2018年1月重磅新书

小学生开始学Python,最接近AI的编程语言:安利一波Python书单

政策升温:大家都在学大数据,一大波好书推荐

8本新书,送出一本你喜欢的

AI经典书单| 入门人工智能该读哪些书?​​​

​长按二维码,可以关注我们哟

每天与你分享IT好文。


在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!

扫一扫上方二维码,回复“关注”参与活动!

点击阅读原文,购买《“笨办法”学C语言》

阅读原文


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值