你是编程初学者,不知道该选择什么程序语言
发表时间:2023-10-11 16:40:36
文章来源:炫佑科技
浏览次数:169
菏泽炫佑科技 菏泽炫佑小程序开发 菏泽炫佑app制作 炫佑科技
你是编程初学者,不知道该选择什么程序语言
许多编程初学者仍然写信给我寻求建议,询问我应该学习什么编程语言以及如何学习。 由于我知道如何掌握“所有”编程语言,所以我总觉得学习“一种”语言的问题比较低级,所以我一直没有时间回复他们:P 但渐渐地,我发现它是不仅仅是新手。 就连很多美国大公司的高级工程师也不明白这个问题。
今天我感到很有动力,想统一回答一下这个期待已久的“首要问题”。 好像以前写过类似的话题,现在想再写一下。 因为在和很多人交流之后,我对自己脑子里的想法有了更准确的表达(不是翻译成文字)。
如果您有以下任何困惑,这篇文章可能对您有所帮助:
您是编程初学者,不知道选择哪种编程语言来开始。 你是一名高级程序员或团队领导,对各种新兴语言感到困惑,不知道该“投资”哪种语言。你的团队为使用哪种编程语言而争论不休,进行各种宗教斗争。 你追随潮流,采用一些时髦的语言,两个月后却发现自己深陷泥潭,惨不忍睹……
虽然我不再关心这些世俗事务,但不容置疑的现实是,编程语言仍然是一个非常重要的话题,而且这种情况短期内不会改变。 程序员职位往往要求熟悉某些语言,有些奇怪的公司甚至要求你“深入了解 OOP 或 FP 设计模式”。 对于在职程序员来说,编程语言仍然是一个会让人脸红的宗教话题。 太宗教化了,以至于当我批评、嘲笑某些语言(比如Go语言)时,有些人会本能地认为我是另一种语言(比如Java)的粉丝。
显然我不能成为任何语言的粉丝,我什至不是殷语的粉丝;)对于任何我以前从未见过的语言,我只是拿起它并使用它,而不需要经历学习过程。 看完这篇文章,也许你就会明白我为什么能达到这样的效果了。 一旦理解了这里发生的事情,每个程序员都应该能够做到这一点。 好吧,我希望。
重视语言特征,而不是语言
许多人关心自己或他人是否“懂得”某种语言,钦佩“发明”某种语言的人,并争论各种语言的优劣。 这些问题对我来说不存在。 虽然我写过文章批评过很多语言上的缺陷,但在实际工作中我很少和别人争论这些。 如果其他人在我周围争论,我什至会戴上耳机,甚至懒得听他们说什么;)为什么? 我发现*终的原因是我看重的是“语言特性”而不是整个“语言”。 我可以用任何语言编写出不错的代码,即使是*糟糕的语言。
任何“语言”都是各种“语言特征”的组合。 例如,编程语言就像计算机。 其品牌可能称为“”、“IBM”、“Dell”或“Apple”。 那么,你能说Apple一定比IBM更好吗? 你不能。 你得看看它装的是什么型号的处理器,有多少个核心,主频是多少,有多少个L1缓存,L2缓存……,有多少内存和硬盘,分辨率是多少显示器是什么,显卡是什么类型的 GPU。 、网卡速度以及其他各种“配置”。 有时您还必须查看各个组件之间的兼容性。
这些配置与编程语言相对应,就是所谓的“语言特性”。 举一些语言特征的例子:
这些语言特性就像你选择电脑时看它的配置一样。 在选择电脑时,没有人会说戴尔一定是*好的。 他们只会说这个型号配备了英特尔的i7处理器,比i5更好。 DDR3内存比DDR2快很多,SSD比i5快很多。 磁盘速度更快,ATI 显卡很垃圾……等等。
对于编程语言来说也是如此。 对于初学者来说,其实不用担心先学哪门语言,再学哪门语言。 曾经有人给我发了一封电子邮件问这个问题,我为此苦苦挣扎了几个星期。 结果我连语言都没有开始学。 随着他必须奋斗的时间,他实际上可以掌握所有他所奋斗的语言。
初学者常常不明白每种语言都必须具有一组“通用”功能。 比如变量、函数、整数和浮点数运算等等,这些都是每一种通用编程语言必备的,一个都不能缺少。 只要你通过“某种语言”学习了这些特性,并掌握了这些特性的基本概念,你就可以随时将这些知识应用到任何其他语言中。 你在这方面投入的时间基本上不会被浪费。 因此,初学者都在为“先学哪门语言”而苦恼。 这样的时间不值得花费。 *好选择一种语言并开始使用。
如果你不能利用一种语言的基本特性写出好的代码,那么换成另一种语言也无济于事。 你也会写出同样糟糕的代码。 我经常看到一些人写出非常混乱和糟糕的 Java 代码,但他们批评 Java你是编程初学者,不知道该选择什么程序语言,并雄心勃勃地转向 Go 语言。 这些人不明白,能否写出好的代码取决于人,而不是语言。 如果你脑子里没有一个清晰简单的心智模型,你用任何语言来表达它都会是一团糟。 如果你不擅长编写 Java 代码,那么你也不擅长编写 Go 代码,甚至更糟。
许多初学者不明白,如果一个熟练的程序员开始使用一种新的编程语言,他往往不会阅读有关该语言的大部头手册或书籍,而是首先有一个需要解决的问题。 当他手头有问题时,他可以花两分钟浏览该语言的手册,看看该语言大致是什么样子。 然后,他直接拿起了一段示例代码,开始修改,试图将代码改成他想要解决的问题。 在这短暂的过程中,他很快就掌握了语言,并用它来表达自己内心的想法。
在此过程中,根据需要,他可能会提出以下问题:
注意到了吗? 上面每个引号内的内容是一个语言特征(或概念)。 这些概念可以存在于任何语言中,尽管语法可能不同,但其本质是相同的。 比如有的语言的参数类型写在变量前面,有的写在后面,有的用冒号分隔,有的则没有。
当您编写实际代码并解决手头的问题时,这些实际问题自然会出现,而不是从一开始就仔细阅读语言手册。 因为凡是掌握了语言特性的人都知道,自己所需要的特性在任何语言中必定有对应的表达方式。 如果没有直接的方式来表达它,那么就必须有一些“绕过”它的方法。 如果有直接表达式,只是语法略有不同。 因此,他带着问题去寻找功能,就像查字典一样,而不是淹没在大部头的手册中,睡了一个月才开始写代码。
掌握了一般语言特征后,剩下的就是某些语言的“特定”特征。 任何研究语言的人都知道,设计新的、好的、无害的功能是非常困难的。 所以一般来说,一门好的语言不会超过一两个独特的新特性。 如果一种语言声称拥有超过5个新特性,那么你就要小心了,因为它们带来的可能不是优势,而是灾难!
同样,*好的语言研究者往往不是某种语言的设计者,而是某些关键语言特性的设计者(或支持者)。 例如,著名的计算机科学家都是“递归”的坚定支持者。 递归存在于现代语言中,但你可能不知道早期的编程语言并不支持递归。 这种情况直到Algol 60委员会被强烈要求增加对递归的支持才得到改变。 Tony Hoare 也是一位语言功能设计师。 他设计了几个重要的语言功能,但从未设计过任何语言。 另外,别忘了还有一位语言专家,名叫王殷。 他是union类型的早期支持者和实现者,也是的支持者。 他在博文中指出了与union类型的关系:P
很多人盲目崇拜语言设计者。 一旦他们听说有人设计了(或者委婉地称为“发明”)一种语言,他们就会热血沸腾,陷入钦佩之中。 但他们不明白,其实所有的编程语言都只是像戴尔、联想那样的“汇编机器”。 语言特性的设计者是Intel、AMD、ARM等核心技术的创造者。
合理的介绍性语言
因此,如果初学者想要事半功倍,就应该从一门没有明显严重问题的“合理”语言开始,掌握*关键的语言特性,然后将这些概念应用到其他语言中。 什么是合理的介绍性语言? 我个人认为可以用这些语言来入门:
那么相比之下,哪些语言是我不推荐入门的呢?
一般来说,你不应该使用所谓的“脚本语言”作为起始语言,尤其是那些源自早期 Unix 系统的语言。 虽然它是对 Unix Shell 的改进,但它仍然没有摆脱脚本语言的根本问题——它们的设计者不知道他们在做什么:P
使用脚本语言学编程时一个非常严重的问题是学习者无法抓住要点。 脚本语言经常在语法中加入一些系统工具之类的东西(比如正则表达式、Web概念),导致初学者在它们上面浪费太多时间,而没有理解编程*关键的概念:变量、函数、递归和类型。 ……
不推荐Go语言的原因也是类似的。 虽然Go语言不是脚本语言,但它的设计者显然不明白他们在做什么。 所以当你使用Go语言学习编程时,你不能专注于*关键、*好的语言特性。 关于Go语言的各种问题,可以参考这篇文章。
同样,我认为 Rust 不适合作为入门语言。 Rust花太多精力吹嘘自己的“新特性”,而这些新特性不仅不是*关键的部分,而且很多都是有问题的。 如果初学者过早地关注这些特性,不仅学不到*关键的编程思想,还可能误入歧途。 关于Rust的一些问题,可以参考这篇文章。
掌握关键的语言特征并忽略次要的特征
为了达到我前面提到的掌握效果,初学者应该专注于语言*关键的特性,而不是被次要特性分散注意力。
举个夸张的例子。 我发现雉鸡大学的很多编程培训课程和编程入门课程经常教学生如何打印“Hello World!”,然后要求他们记住各种“格式字符”的含义并实现各种复杂的格式。 打印输出甚至需要打印到文本文件然后读出......
但众所周知,这种输入输出操作实际上根本不是语言的一部分,对于掌握编程的核心概念来说是次要的。 有的人的Java课程已经上几个星期了,还在布置各种作业。 学生写了几百行,却不明白什么是变量和函数,甚至不明白如何使用算术语句和循环语句! 这就是为什么许多初学者觉得编程很困难的原因。 我连%d、%f、%.2f的意思都记不清了,还怎么学编程啊!
然而这些山鸡大学的“教授”称号实在是太洗脑了,以至于受过他们教过的学生(比如我女朋友)来找我求教,居然骂我教了没用的东西,连作业都不学。 它无法完成:P 不要告诉我有关 for 循环、函数等的内容...您可以等几个月,直到我知道如何使用它们后再学习它们吗?
所以你会发现,一旦被不好的老师教了,程序员基本上就毁了。 即使遇到了好老师,他们也很难纠正。
当然,这是一个夸张的例子,因为它根本不是语言特征,但这个例子从同一角度说明了次要的、表面的语言特征带来的问题。
以下是次要语言特征的一些示例:
自己实现语言功能
基本学习了各种语言特性并能够使用它们来编写代码后,下一步就是实现它们。 只有实现各种语言特性,你才能完全拥有它们并成为它们的主人。 否则你只是它们的使用者,你将被语言的设计者所引导。
有位大师曾经说得好,要完全理解一门语言,*好的办法就是自己去实现它,也就是自己写一个解释器来实现它的语义。 但我觉得这句话应该稍微修改一下:充分理解一个“语言特性”的*好方法就是自己去实现它。
请注意,我在这里将“语言”更改为“语言功能”。 您不需要实现整个语言来实现此目的,因为我们*终使用语言功能。 只要你自己实现了一个语言特性,你就可以了解这个特性在任何语言中是如何实现和使用的。
比如学习SICP的时候,大家都会亲自去实现一个面向对象的系统。 使用面向对象实现中的差异实现的面向对象系统。
这种效果是直接学习OOP语言无法获得的,因为在学习Java、C++等语言时,你只是一个用户,但在自己实现了OO系统之后,你就成为了一个创造者。
类似的功能包括类型推断、类型检查、惰性求值等等。 我已经实现了几乎所有的语言功能,所以任何语言在我面前都是一个可以随意拆装的玩具,而不是神圣的凌驾于我之上。
总结
写了这么多,重要的词重复三遍:语言特色,语言特色,语言特色,语言特色! 无论你是初学者还是经验丰富的程序员,你都应该关注语言特性,而不是挂在整个“语言品牌”上。 只有这样,我们才能达到精通小程序开发一般用什么语言,学会任何语言并且几乎可以立即使用它,并编写高质量的代码。
原来的: