老程序员的建议:专心学好一门编程语言就行!

摘要:大多数程序员在其职业生涯中,接触到的编程语言不止一种,但主要掌握并运用的多数只有一门。那么在数量繁多、适用领域各不相同的编程语言中,哪一门更适合你来学习呢?“老程序员”Eleanor Berger 总结了这些年来他对各种编程语言的看法及其发展历程,接下来就让我们一睹他心目中的最佳编程语言是什么。

原文链接:https://devtails.xyz/@adam/switching-to-c-over-modern-programming-languages

作者 | Eleanor Berger
译者 | 弯月

最近,著名游戏程序员、id Software 创始人之一John Carmack在采访中表示,程序员应该专心学好一门编程语言。这倒让我感到有点惊讶。虽然我个人非常赞同这条建议,但在如今的程序员圈子里,这种观点是有争议的。

我猜,我就是大家所说的“老程序员”了。我的岁数不小了,一生都在从事编程工作,而且从步入社会之后就一直在从事这项专业工作。有时,我觉得自己是一名编程语言爱好者,亲眼目睹了许多编程语言的发展。回顾过去,这是一段激动人心的历史,我们会不由自主地得出一个(错误的)结论:多掌握几种编程语言总没坏处。编程语言的历史发展非常精彩,但如今的发展形势相对比较平和。

在本文中我想回顾一下曾经的历史,总结经验教训,并看一看究竟哪种编程语言才是最好的标准化语言。

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

史前阶段(50年代~80年代)

 

随着计算硬件和计算机科学作为一门学科逐渐兴起,计算机编程(除了处理器本身的指令之外)也开始缓慢地发展。在最初的几十年里,编程语言主要是学术界的研究对象,还俘获了一小部分研究人员。程序员的选择很有限,主要取决于领域。

业务编程使用COBOL,科学编程使用Fortran,还有一些其他语言通常用于特定领域、研究或硬件。

对于大多数程序员来说,整个编程生涯或在很长一段时间里,只需专心学习一门编程语言。虽然有人对编程语言的设计感兴趣,但彼时该领域还很稚嫩。尽管出现了一些很有趣的创新,但对于如何才能设计一种好的编程语言,人们还没有很好的理解。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

专业化(80年代~90年代)

 

随着计算机硬件数量的增加以及用途的日益多样化,编程语言的数量也开始增长,编程语言的选择变成了一个流行的话题。人们开始对编程语言进行分门别类。我们可以通过程序员的种类以及他们渴望达到的专业水平,判断他们会选择哪种语言。个人计算机编程爱好者使用越来越流行的BASIC。这是一种很荒诞、很原始的编程语言,却被广泛使用并成为了一代程序员(包括我自己)的引路人。Pascal引入了结构化编程,并产生了巨大的影响(Pascal与Turbo-Pascal 和 Delphi 建立了一个蓬勃发展的社区,但最终消失了)。

起源于UNIX的C成为了系统编程语言。C++成为了C的后继者,并借鉴了Smalltalk的面向对象编程,成为了专业应用程序和服务开发人员的语言。最终 Visual Basic(与BASIC毫无关系)普及了“可视化编程”,满足了应用程序开发的需求(随着 Windows 的出现而迅速增长),并成为大众的首选。但人们普遍认为,VB程序员是领域专家兼职编程工作,而C和C++才是“专业”的编程人员。

这个阶段,人们仍然没有很好地理解编程语言的设计,导致许多流行的编程语言很多方面的设计都不太理想。C语言简单而强大,但很难熟练掌握,有可能出错的地方太多。C++的意图虽好,但最终的设计不佳,而且使用感不好。Visual Basic既有趣又简单,但有点儿戏,在当时的技术条件下,优雅与效率都不达标。Smalltalk 和 LISP 都是有趣而优雅的语言,但由于捆绑到了专门的硬件和昂贵的工具,导致最后失势。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

成熟(90年代~2000年)

 

后来,互联网兴起。互联网对编程语言的影响究竟有多大也许未可知,但无疑这是一个重大因素。很久以前,编程语言是一个稀有之物,通常诞生于研究实验室和大型商业公司;但如今似乎任何一个人都可以开发出自己的编程语言。曾有一段时间,PERL成为了流行的通用语言,涵盖了从系统管理到 Web 编程的方方面面。后来,Python从科学研究语言变成了简单易学的通用语言,尽管最初发展缓慢,但最终席卷了整个世界。据传,Netscape 的 Brandan Eich仅用了几天时间就开发出了JavaScript(作为一种功能十分有限的浏览器扩展语言)。这不仅证明Eich是一个天才,也证明那个时期人们对编程语言的设计有了很好的理解。

这一时期出现了许多其他的编程语言,其中最有名的是Java。这门语言本身并没有特别之处,但它提供的JVM是一个通用的运行时环境,实现了“编写一次,到处运行”,也就是说该语言十分通用,不受特定硬件、操作系统、或目标环境的限制。严格来讲,早期的JVM并没有什么值得炫耀的,但它开创了语言运行时及部署选项日益成熟的时代。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

迅速发展(2000年~2010年)

 

自JVM以后,编程语言就开始朝着一个有趣的方向迅速发展。源自Self语言(Smalltalk的后继者,虽然优秀但非常失败)的即时编译器(JIT)得到了更深入的研究,从而诞生了Java的HotSpot,而微软为了对抗Java推出了.NET CLR。.NET则更进一步,将 CLR(Common Language Runtime,公共语言运行时)作为了多语言的通用运行时,而不仅仅是C#。事后看来,这是一个分水岭:编程语言的选择变得无关紧要。这可能不是微软做出这个选择的主要原因(当时他们仍在努力继续支持流行度非常高的Visual Basic,还有C#),再加上那段时间微软的封闭式许可,最终CLR未能成为最受欢迎的运行环境。但在千禧年之后的第一个十年中,编程语言的数量越来越多,而且无处不在。

另一方面,程序员的数量也出现了爆炸式增长。随着软件的需求快速增长,以及工具和知识的普及,全世界数百万人都变成了程序员。这些程序员也是人类,他们渴望强烈的群体认同。就像普通人对体育运动团体有着强烈而非理性的看法一样,程序员也开始在编程语言的选择问题上站队。许多程序员迫不得已选择某种新兴、独特、特殊的编程语言。例如,有人声称函数式编程才是王道、Ruby比Python好、Scala将彻底改变数据科学、不选Clojure是你的损失……至此,编程语言从线性发展进入了混乱的达尔文优胜劣汰时期。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

超标准化(2010年至今)

 

原以为,这个时期的人们会意识到某些编程语言过于疯狂,无法持续发展。然而,实际情况并非如此,相反,情况出现了意想不到的转变。在“云”计算时代,许多应用程序和服务的部署跨互联网上的大量分布式节点,使用哪种编程语言似乎已无关紧要。程序员都在开发互相交流的独立组件,又有什么必要纠结编程语言呢?组件之间并不需要知道彼此是用哪种语言编写的。如果程序员喜欢用X语言编写组件,那么就用这种语言好了。谁在乎呀。

在不同机器上运行的组件也是如此,随着Docker的发布,容器得到了普及,无论是在一台机器上运行的应用程序,还是通过编排软件在机器集群上协作运行的软件,都可以使用相同的范例轻松管理。

如今人们仍在开发新的编程语言,其中不乏前途无量且备受期待的语言。有些是特定领域的(移动应用程序使用的Swift、Kotlin 和 Dart,以太坊智能合约使用的Solidity),而有些则比较通用,但每种语言都得益于这几十年来积累的经验教训(面向云编程的Go,面向系统编程的Rust,以及JavaScript的超集TypeScript,等等)。

与此同时,编程世界达到了一个新的成熟度,我们不再追逐每一种新趋势,采用每一种新语言。我们都成长了。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

专心学好一门编程语言

 

毫无疑问,有些编程语言确实更为出色,而有些编程语言则更适合处理某些特定的用例。任何从事过编程一段时间的人都清楚,学习一门新语言一点也不难。大多数程序员只需一个下午,就可以轻松学习一门新语言的基础知识,使用几天后就可以多或少地提高工作效率。新手程序员可以从任何一门主流编程语言开始学习,并将学到的编程知识轻松地应用到其他语言中。

然而,频繁变更编程语言并非好事,原因主要有两个。首先,学习编程语言有点像学下棋。你可以快速学习规则,但这并不意味着你可以战胜经验丰富的玩家。你需要学习策略,而这需要时间和练习。这是一个由最佳实践、陷阱、优化技术,以及库、工具和社区组成的生态系统。其次,编程虽简单,却容易出错。即使拥有常见的编程经验和最好的工具,将想法转换为计算机代码也不是一件直觉行为。无论程序员建立了怎样的直觉,也必须经历反复使用、即时反馈和纠错的循环。每次更换编程语言,你都需要付出代价。所以,根据我的经验,编程语言的选择很重要,但是一旦做出了选择,从长远来看,就应该坚持下去。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

如何选择编程语言

 

时至2022年,我们在选择编程语言时,需要考虑以下几点。

首先,最关键的考虑因素是语言的适用范围。如果是特定的领域,必须使用一些特定于领域的语言,则最具普遍适用性的语言是首选。值得庆幸的是,自从Java提出“编写一次,到处运行”以来,运行时和部署便不再是问题,成本和许可也不再是制约因素。时至今日,所有编程语言、运行时以及各种工具基本都可以免费获取。如果某种语言不适合某个特殊的场合,只能说它的流行度不够,没有普及到所有人;要么是因为一些基本因素,导致该语言确实不适合该任务。

流行度很重要,我们应该选择拥有强大的社区、丰富的信息来源、大量其他程序员可供合作或雇佣的语言。任何不受欢迎的语言都不值得选择。如果遇到特殊情况,则选择会更困难。没有任何一种语言能够适用于所有场景,但在理想情况下,通用的主流语言应该足以应对大多数场景。

最后,我们选择的编程语言应该优于大多数其他语言。即使在2022年,仍有一些糟糕的编程语言,难以学习和使用,很容易让程序员陷入困境。

鉴于上面的陈述,我认为实际上我们并没有太多选择。下面,就让我们来看看这些最佳编程语言。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

最佳编程语言

 

JavaScript / TypeScript

编程语言界的JavaScript就像人类交流时使用的英语一样。它是最流行、最通用的编程语言,适用于许多不同的场景(浏览器/前端、系统/后端、作为扩展语言嵌入到许多环境中)。JavaScript的运行时(V8 / Node / Deno)非常高效,拥有许多出色的工具和庞大的社区。

TypeScript是JavaScript的超集,引入了强类型和标准工具,正在迅速发展成为JS编程的默认选择。

Rust

Rust拥有C/C++的所有功能,更易于使用,而且也没有太多陷阱。Rust的社区和生态系统非常强大且在不断发展,工具也很好用。如果你需要的功能Rust都提供了,那它绝对是不二之选。以前只能使用C或C++的场合,如今也可以选择Rust。此外,Rust还在建立自己的WebAssembly通用语言(WebAssembly可以说是终极版的“编写一次,到处运行”的运行时)。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

强有力的竞争对手

 

Python

我使用Python已经超过20年了,可惜时至2022年,Python依然算不上真正的通用编程语言。原因之一是,Python仍然非常低效,很多注重性能的场合都无法采用Python。还有一个原因是,它未能进入主流的面向用户环境,比如网络浏览器或手机。尽管如此,Python仍不失为一种出色的编程语言,而且在数据工程/数据科学/机器学习中占据了重要位置,所以如果你从事这些领域的工作,那么Python绝对是一门值得了解和热爱的语言。就目前的情况来看,Python很可能会作为数据科学的通用语言继续发展下去,但可能无法突破这个领域。

Go

Go是一种非常适合“云”编程的语言。Go语言优雅、易于学习和使用,拥有出色的社区、生态系统和工具。它被广泛应用于云原生领域的核心产品,因此它会长期发展下去。不幸的是,Go并没有普遍的适用性,基本无法用于互联网服务器之外的环境。此外,由于Go设计上的选择,它在C/C++世界中表现不佳。Go固然好,但如果必须做出选择,凡是Go能实现的功能Rust都可以实现,随着时间的推移,Go有可能会被主流系统编程语言取代。

C#/Java

C#及其生态系统非常出色,你可以用它实现很多功能。Java的各个方面都比不上C#,所以我不理解为什么有人会喜欢它,但Java确实很流行。C#的应用很广泛,不仅是一种系统和“商业”语言,现在更是延伸到了移动应用程序和浏览器。强大的运行时,伟大的生态系统。但是,除非你需要C#的一些量身定制的运行时和工具的功能,否则在短期内C#很难与JavaScript和Rust竞争。

C/C++

根据林迪效应,C和C++在未来几十年内将继续流行下去。如果你已是这两种语言的专家,肯定不愁找工作。如果有这方面的需求,则花时间学习二者也是不错的选择。否则,选择Rust更合适。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

荣誉奖

 

Swift / Kotlin / Dart

这几种语言在特定领域占有一席之地。如果需要移动UI编程,则这些是不错的选择。但JavaScript的适用性更普遍,而且也同样适用于移动开发,因此我们更应该选择JavaScript。

LISP(Racket / Clojure)

LISP很特别,即使日常工作没有这种需求,也应该学习一下。Racket 是最先进的、非常复杂的语言(实际上它是一种语言构建工具包)。据传,Clojure的功能很强大,因为它的目标是JVM,可以使用 Java 库。但我不清楚这个卖点有多大作用。

Haskell / F# / Scala

函数式语言很重要。在某些情况下,它们是更优的选择。Haskell是函数式编程的代表。F#具有更好的普遍适用性,因为它的运行平台是CLR,并且可以使用 .NET 库。Scala不是纯粹的函数式,但非常通用,并且在 JVM 上运行。

Julia / R / MATLAB

Julia非常适合数学领域。R和MATLAB都有各自擅长的特定场合。不过,在Python主导的数据工程领域,这些编程语言恐怕很难幸存下来。

PowerShell

如果你从事shell编程,那么PowerShell是迄今为止最好的选择。它适用于所有操作系统,所以我们没有理由使用任何其他 shell。PowerShell也算是一种通用编程语言,但实际上在非系统管理之外,没有人使用它。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

迟暮之年

 

PHP / 红宝石 / PERL

这些语言也曾有过辉煌的岁月,主要是作为网络“后端”语言。无论你如何看待这些语言,如今都不应该再在它们身上白花力气。它们都在走向灭亡。

Visual Basic / VBA

VB 改变了世界,但如今却被淘汰出局了,无论是作为通用语言还是作为对其他程序的扩展。在遥远的过去可以用VB实现的功能,如今都可以用其他现代语言更出色地实现。

 

20 年 Python 老程序员的建议:专心学好一门编程语言就行!

总结

 

我喜欢编程语言,而且永远对新语言充满了好奇。但是,就目前而言,TypeScript是我心目中的C位,而在需要强大的功能和低级访问权限的情况下,Rust居第二。我相信,2022年几乎所有程序员都与我有类似的看法。

转自:https://mp.weixin.qq.com/s/7M2NfuO5UrFein8PVTgBFQ

B站最惨程序员做的网站,连我奶都能干崩溃。

 
B站最惨程序员做的网站,连我奶都能干崩溃。程序员,一个互联网时代的“ 落魄打工仔 ”。
他们除了要忍受产品经理骑在脖子上拉屎,还要面对各种猝不及防的糟心事。包括但不限于服务器崩溃、改 BUG、加注释、接手同事留下的垃圾代码山等。
但好在,这依然是当下最炙手可热的职业,永远都有满腔热血的新人加入,也永远有大佬乐于分享自己的代码技术。
 
比如,在 B 站,你也许就见过这位叫「程序员鱼皮」的 UP 主,他常常发一些代码教学的视频,引领新人入坑。
B站最惨程序员做的网站,连我奶都能干崩溃。
这位 UP 主看上去脾气好,举手投足也很有礼貌,毫无攻击性,实事也确实如此。
 
不过,也正因为柿子要挑软的捏,最近几个月,鱼皮过得不太顺畅。
 
B站最惨程序员做的网站,连我奶都能干崩溃。堪称一个受苦,举步维艰。
 
从他这个“ 程序员之耻 ”的系列视频中,我们就能窥见一些端倪。
B站最惨程序员做的网站,连我奶都能干崩溃。
事情,还要从 1 月 10 号的视频说起。
 
鱼皮建立了一个面试刷题网站,叫「测试鸭」,初心纯粹——为了帮助广大程序员面试。
 
网站里有各种题目,类似于驾考宝典,每个人都可以根据自己的岗位模拟面试。
B站最惨程序员做的网站,连我奶都能干崩溃。
但小树不修不直溜,没有一些漏洞攻击,网站的安全系统就得不到成长。
于是,几个热心网友,不在网站刷题,来帮网站“ 成长 ”来了。 
 
B站最惨程序员做的网站,连我奶都能干崩溃。比如在网页里,整一段< 鱼皮是狗 >的 xss 狠活儿注入。
 
编程小知识:xss,中文名叫跨站脚本攻击,攻击者通过在网站注入恶意指令代码,来获得更多的网站操作权限。
B站最惨程序员做的网站,连我奶都能干崩溃。
或者,直接用爬虫爬了网站内 500 多页的试题内容。
 
而鱼皮的题库一共才 400 多页,属于是提前预判了 100 页的内容。
 
编程小知识:爬虫,一种抓取公开网站内容数据的技术手段。
B站最惨程序员做的网站,连我奶都能干崩溃。
甚至,有人一口气刷了 20 万条灌水内容。
 
B站最惨程序员做的网站,连我奶都能干崩溃。直接把网站干崩溃了。
B站最惨程序员做的网站,连我奶都能干崩溃。
最骚的是,走之前还不忘嘲讽一波。
B站最惨程序员做的网站,连我奶都能干崩溃。
也有些人,在网站里疯狂打广告、恶意刷评论、刷点赞数等等。
与上面几位大哥相比,已经算是出手客气的了。
B站最惨程序员做的网站,连我奶都能干崩溃。
历经这次事件之后,鱼皮意识到了自己的网站有很多漏洞,急需修复。
 
于是励精图治,回去又改了改 BUG,进行了一个版本的更新。
 
本来新网站被攻击,还挺稀松平常的,整件事看着也就像一个网友们的恶搞。
 
B站最惨程序员做的网站,连我奶都能干崩溃。但谁也没成想,这次竟然激起了大伙的胜负欲。
 
乃至于不少新人抛下狠话,势必要把网站撂倒,丝毫没有手下留情的意思。
B站最惨程序员做的网站,连我奶都能干崩溃。
B站最惨程序员做的网站,连我奶都能干崩溃。
然后没过两天,就有人摧毁了网站的回答区。
 
原因是这人在回答区,回复了一条多达 6M 大小的评论,而他光是昵称就有 3M 多。
 
接着自己再回复一次自己,数据量过大,评论区就炸了。
 
B站最惨程序员做的网站,连我奶都能干崩溃。后来本人出面,表示没有恶意,就是玩玩,嗯,玩玩。
B站最惨程序员做的网站,连我奶都能干崩溃。
还有人克隆了一个站长鱼皮的 ID 和头像,让系统误以为这人是鱼皮自己。
 
这样一来,他便可以在社区内肆意妄为,发出的灌水内容,连鱼皮自己也删除不了。
B站最惨程序员做的网站,连我奶都能干崩溃。
更有甚者,想对网站来上一波 DDoS。
 
好消息是,攻击目标的 IP 地址搞错了,鱼皮的测试鸭网站没啥事。
B站最惨程序员做的网站,连我奶都能干崩溃。坏消息是,一不小心误伤了另一个无辜的反馈平台。。。
 
编程小知识:DDoS,中文名分布式拒绝服务,可以在隐藏攻击者 IP 的情况下,塞爆对方的服务器,使攻击目标无法正常使用,是一种难以防范、非常强力,造成后果也十分严重的手段。
B站最惨程序员做的网站,连我奶都能干崩溃。
至此,这位 UP 主就被人盯上了,简直是个行走的 AKA 靶子哥。
 
比如在某天直播里,他本想教教网友们怎么建立自己的网站。
 
但还没开始呢,就因为暴露了自己的 IP 地址,没几分钟,便被人用大流量 DDoS 攻击了。
 
现场表演了一个什么叫直播事故,弹幕里还有称赞攻击者技术高超的。
B站最惨程序员做的网站,连我奶都能干崩溃。
连续被锤几个月后,鱼皮实在坐不住凳子了。
 
正如那句俗话所说的一样,生活若将我击倒,那我就不站起来了。
 
所以,他干脆躺平,接受了自己的靶子人设,二话不说开摆——
 
B站最惨程序员做的网站,连我奶都能干崩溃。专门建立了一个用来被攻击的网站。
 
我这辈子都没听过这么离谱的要求.jpg ▼
B站最惨程序员做的网站,连我奶都能干崩溃。
为了让所有人都能顺利攻击自己的新网站,他甚至还配上了贴心的新手教程。
 
像下面这个,根据提示连续快速点击收藏按钮,就能导致网站反映不过来,而显示错误。
B站最惨程序员做的网站,连我奶都能干崩溃。
对于超级小白,还可以使用网站右下角的「工具包」进行攻击。
 
工具包里内含各种快捷选项,不少行为都能一键生成。
 
像生成灌水内容、营销广告、虚假内容等,点击一下就可以将内容复制到剪切板。
 
“ 攻打 ”起来,可以说相当方便了。
B站最惨程序员做的网站,连我奶都能干崩溃。
再往下一栏的「专业工具」里,则需要掌握一定的编程基础。
比如点击「查看网页源代码」,就会跳出一个鱼皮留下的登录密码提示。
如果你连网页源代码都不知道怎么打开,那鱼皮还保姆级手把手教你要点击右键查看
 
顺便一提,进入源代码页面后,世超先是全局搜索了一下“ Password ”,结果啥都没有,然后又换中文搜了一下“ 密码 ”,登录密码就出来了。。。
 
只能说,他是真的怕我找不到,我哭死。
B站最惨程序员做的网站,连我奶都能干崩溃。
而成功获取密码后,在用户登录界面,就能直接用站长的密码登录了。
B站最惨程序员做的网站,连我奶都能干崩溃。
每发现一个 BUG,还会跳出一个解锁成就的小提示。
 
在网站内,表现为 UP 主鱼皮的血压值提升。
 
说白了,就像是一个类似游戏内的成就系统。
B站最惨程序员做的网站,连我奶都能干崩溃。
如果实在找不到 BUG 也没关系,因为网站内还有个攻击提示目录。
 
每种攻击手段下,也都会附赠一段关于如何防范的科普小知识,或是跳转到百度百科的链接。
B站最惨程序员做的网站,连我奶都能干崩溃。
对了,介绍网站的视频刚发出来才 3 分钟,这个“ 讨打 ”网站,就被人打得上不去了。
 
B站最惨程序员做的网站,连我奶都能干崩溃。看到这,不得不佩服各位老哥的手速。
B站最惨程序员做的网站,连我奶都能干崩溃。
B站最惨程序员做的网站,连我奶都能干崩溃。相信懂行的程序员们,早就察觉出不对劲了。
因为很多地方,它都算不上什么真正的黑客攻击。
 
但不得不承认的是,这对刚接触编程的小白来说,无疑是个预防网站攻击的新手教学。
 
而鱼皮的目的也是为了给大伙提个醒,真等到自己建立网站的时候,能长点记性,做好安全保护措施。
B站最惨程序员做的网站,连我奶都能干崩溃。
毕竟,网站被攻击可是一件家常便饭的事。
 
正所谓,天下没有绝对安全的网站,安全措施做得再好,也有魔高一尺的黑客,找到漏洞。
 
这些自命不凡的黑客们,有时候甚至不为了钱,单纯就是想证明自己的技术屌,而导致各种重要网站服务器瘫痪。
 
像小网站也就罢了,在一些大网站上,一次崩溃几个小时,可能就会造成成百上千万的财产损失。
 
比如攻击支付宝这个,
但最后被法律的制裁了 ▼
B站最惨程序员做的网站,连我奶都能干崩溃。
 
想要击败对手,就要成为对手,了解对方的套路。
 
所以想学习网站防护,首先就得知道常见的攻击手段都有啥。
 
B站最惨程序员做的网站,连我奶都能干崩溃。而鱼皮这位 UP 主提供了这样一个平台,那些想自己搭建网站的新手们,现在不去攻打还寻思啥呢?
 
不过,这也就是个战术交流,大家可别会错意。
 
真要再把网站搞到进都进不去,那就太不地道了。
撰文:赤膊朋克   编辑:面线
图片、资料来源:
B 站 UP 主:程序员鱼皮
百度百科、云头条新闻

B站最惨程序员做的网站,连我奶都能干崩溃。

B站最惨程序员做的网站,连我奶都能干崩溃。

转自:https://mp.weixin.qq.com/s/R_B5Cvr1AmAvyut0Am0cwQ

构建一套可靠的分布式大型软件系统

https://icyfenix.cn/

我不服!这开源项目居然才888个星!?

先看一下我看了之后整理的思维导图吧:

我不服!这开源项目居然才888个星!?

看不清没关系,文末会给你领取链接的。

看完之后我个人的一个感受是:关于分布式架构方向,写的很多很全很系统。而且都是笔者一路走过来的经验之谈,浓缩在了文章里面。

对得起首页的这一句口号:构建可靠的大型分布式系统。

谁写的?

那么这个开源书的作者是谁呢?

周志明。

是的,就是你想到的那个凭借一己之力拉高了 Java 开发者内功水平,把 JVM 带到了初级面试题环节的男人。

我不服!这开源项目居然才888个星!?

其实你仔细看周佬写的自我介绍,很有小细节。

程序员、研究员、作者、布道师这四个职业,排在第一的是最没有噱头的“程序员”一职。

而在程序员里面,给自己的描述是:

一名兼职一些管理与研究工作的程序员。

其实关于这个点,我看过周佬的一些公开场合的自我介绍,都是说自己是一个“兼职一些管理工作的程序员”,给自己这样的人设标签。

他在自己写的《程序员之路》一文中解释过这个标签。

他想要透过这个标签表达的是对于一枚程序员,以后是想要发展为一个架构师还是研发管理者,都不要轻易地离开技术领域的一线前沿。

离开技术、放弃编码的决定很可能会像你高考之后放下的数学、生物、地理等知识那样,一旦放手,毕生就很难有机会再重新捡起来。

当你放下代码的时间越长,久而久之,你对代码、技术、产品状态与团队研发状态的理解,渐渐的会和团队成员产生了偏差错位,丧失了细节上给予指导的能力,丧失了专业问题上提出接地气解决方案的能力,只能在无法短期难以校验对错的大战略方向提意见。

在会议、流程及团队管理措施上下功夫,在职业经理人式的宣讲与汇报上寻找存在感。

此刻,你便从团队的导师变成了管理者,最终你与团队的关系,从携手并肩奋斗的伙伴,完全演变成只能靠公司制度与管理职位的权力来维系雇佣关系。

我能理解周佬说的现象,其实是一个非常普遍的现象。甚至有的朋友走上管理岗位的目标就是不再写代码了,基于当前的市场和行业现状,这样的选择是无可厚非的。

只是,有没有那么一点点可能,不要完全抛弃代码。这也需要是你和团队之间的最行之有效的纽带。

就像《代码整洁之道》一书中说的:

软件架构师本身就是最好的程序员,他们会一直编写代码,虽然可能不会像其他程序员输出的代码量那样多,但是只有持续地编程,才能确保他们遇见其他程序员所面对的问题,体会其他程序员心中的感受,因此如果不编程,他们亦将无法胜任软件架构这项工作。

这本《凤凰架构》,周佬自己对它的定位是这样的:

我不服!这开源项目居然才888个星!?

给开发人员整理的关于软件架构方面的技能地图,同时系统的梳理自己的知识,并配备了对应技术方案的演示程序。

真的是一件利人利己的事情。

我本来的想法是先带着你囫囵吞枣的走一圈这一本书,主要起到一个介绍的作用。

但是越写越不得劲的感觉,于是我把写好的大部分都删除了。因为即使我写的这么卖力认真,都没有体现出这本书的价值的千分之一。

你得自己去读,你才知道我没有骗你:这真的是个宝藏啊!

所以我决定换个思路,告诉你这里面有什么就行了,其实就是书中的探索起步一小节。

如果你对里面的某一部分感兴趣,自己主动打开网站去翻一下,那么我的目的就达到了。

探索起步

我不服!这开源项目居然才888个星!?

这是探索起步的更新日志部分,可以看到周佬对于该项目一直在进行维护新内容:

我不服!这开源项目居然才888个星!?

而对于已有的内容,其中的错别字、不通顺的地方、含义不清的地方,他也在抽时间修改,最近的一次修改就是 6 月 6 日,昨天,上周日:

我不服!这开源项目居然才888个星!?

所以,相比于其他的大部分网上的文章来说,会更加实时、系统、优质一点。

全书分为五大部分和两个篇外,而为了让你快速定位到合适自己的部分,周佬也细心的介绍了每一部分对应的读者类型。

  • 引导篇 探索起步这部分面向于准备对文档介绍的内容亲身实践的探索者。
  • 第一部分 演进中的架构:这部分适合所有开发者,但尤其推荐刚刚从单体架构向微服务架构转型的开发者去阅读。
  • 第二部分 架构师的视角:这部分讨论与风格无关的架构知识,适合所有技术架构师、系统设计、开发人员。
  • 第三部分 分布式的基石:这部分面向于使用分布式架构的开发人员。
  • 第四部分 不可变基础设施:这部分面向于基础设施运维人员、技术平台的开发者。
  • 第五部分 技术方法论:这部分面向于在企业中能对重要技术决策进行拍板的决策者。
  • 篇外 随笔文章:这部分无特定读者对象,内容是笔者日常文章的整理。
  • 篇外 附录:这部分面向刚开始接触云原生环境的设计者、开发者。

演进中的架构

其中第一部分我读完之后做的思维导图如下:

我不服!这开源项目居然才888个星!?

我曾经就完整的经历过一个服务从单体系统时代,再到 SOA 时代,最后步入微服务时代的全过程。

所以能比较深刻的理解到周老说的观点:

架构并不是被发明出来的,而是持续演进的结果。

可能你对于其中的后微服务时代和无服务时代稍微有点陌生,但是我换个英文名称,你就应该是非常熟悉了。

后微服务时代其实就是云原生时代,Cloud Native。

而无服务其实就是 Serverless。

但是需要注意的是,周佬把 Serverless 排在了 Cloud Native 之后,其实它们两者并没有继承替代关系。不要因为周老对于两者的书写顺序产生了“无服务就会比微服务更加先进”的错误想法。

周佬对于这两者之间的关系描述是这样的:

如果说微服务架构是分布式系统这条路当前所能做到的极致,那无服务架构,也许就是“不分布式”的云端系统这条路的起点。

架构师的视角

第二部分的思维导图如下:

我不服!这开源项目居然才888个星!?

这一部分主要聊了我们做分布式服务时,一定会涉及到的问题,比如:远程服务调用(RPC)、分布式事务的处理、多级分流、架构安全。

我个人认为这一部分是干货满满的。

其中访问远程服务,对 RPC 和 REST 从各自的起源开始进行了一个详尽的描述:

我不服!这开源项目居然才888个星!?

事务处理小节,你可以看看“共享事务”的概念,其实我发现有一部分号称是微服务架构的项目,走向了“共享事务”的路线。其实这是一种伪分布式,或者说是“阉割版”的分布式。

“共享事务”的提法和这里所列的两种处理方式在实际应用中并不值得提倡,鲜有采用这种方式的成功案例,能够查询到的资料几乎都发源于十余年前 Spring 的核心开发者Dave Syer撰写的文章《Distributed Transactions in Spring, with and without XA》。笔者把共享事务列为本章四种事务类型之一只是为了叙述逻辑的完备,尽管拆分微服务后仍然共享数据库的情况在现实中并不少见,但笔者个人不赞同将共享事务作为一种常规的解决方案来考量。

透明多级分流系统从客户端到网络再到服务端的拆析,这是一种上帝视角的描述,对于一次请求的进过脉络梳理,清晰的了解到系统的方方面面。而这一部分的主题就是“架构师的视角”。

架构师就应该是从这样的一个比较统筹规划的角度去看待系统,不必进入到具体系统的细枝末节中去:

我不服!这开源项目居然才888个星!?

分布式的基石

第三部分分布式的基石:

我不服!这开源项目居然才888个星!?

共识算法、服务发现、流量治理、网络通信、监控预警共同构成了分布式的基石。

可以说如果是一个分布式的服务,都能找到上面的这些关键词的影子。

有些是应用系统自己做的,有些是开源框架就帮你搞定了,你甚至不知道它们的存在。

但是我认为上面的诸如流量治理和监控预警(可观察性)并不是一个分布式服务一开始搭建时所必须的。

大多数情况下,刚刚搭建好的分布式都处于一个蛮荒状态。随着时间推进和业务的发展,会慢慢补充上流量治理和监控预警。

也就是说如果想要分布式服务发展的方向是可监控、可控制的,那么这些东西都是应该有的。

所以“基石”一词,用的像是手术刀一样精准。

接着来到了第四部分,不可变基础设施:

我不服!这开源项目居然才888个星!?

到这里我们就要从微服务走向云原生了。

在这一章,周佬以容器、编排系统和服务网格的发展为主线,介绍虚拟化容器与服务网格是如何模糊掉软件与硬件之间的界限,如何在基础设施与通讯层面上帮助微服务隐藏复杂性,解决原本只能由程序员通过软件编程来解决的分布式问题。

接下来的“技术方法论”属于微服务避坑指南,从目的、前提、边界、治理四个角度去阐述如何更好的使用微服务。

随笔文章

最后一部分是“随笔文章”:

我不服!这开源项目居然才888个星!?

其中的《云原生时代,Java 的危与机》和《程序员之路》这两篇文章,建议你反复观看。

前者是技术方向的,后者是软技能方向的。

读完《Java 的危与机》,我感受到的是一场关于 Java 的自我革命已经悄然开始了。

Java 并不是一个优秀的开发语言,这一点我是非常承认且确定的。但是 Java 有一个庞大的用户群体和异常丰富的生态,这是它的护城河。所以短时间内还倒不下来。

但是大风起于青萍之末。虽然风雨欲来,而包括我在内的很多人都浑然不知。

在文章里面,周佬有这样的一段话:

Java 支持提前编译最大的困难在于它是一门动态链接的语言,它假设程序的代码空间是开放的(Open World),允许在程序的任何时候通过类加载器去加载新的类,作为程序的一部分运行。要进行提前编译,就必须放弃这部分动态性,假设程序的代码空间是封闭的(Closed World),所有要运行的代码都必须在编译期全部可知。这一点不仅仅影响到了类加载器的正常运作,除了无法再动态加载外,反射(通过反射可以调用在编译期不可知的方法)、动态代理、字节码生成库(如 CGLib)等一切会运行时产生新代码的功能都不再可用,如果将这些基础能力直接抽离掉,Helloworld 还是能跑起来,但 Spring 肯定跑不起来,Hibernate 也跑不起来,大部分的生产力工具都跑不起来,整个 Java 生态中绝大多数上层建筑都会轰然崩塌。

“整个 Java 生态中绝大多数上层建筑都会轰然崩塌。”

所以,Java 的这次变革属于釜底抽薪。

读完《Java 的危与机》之后,你再去看《Graal VM》一文,你就明白了:为什么说 Graal VM 的成功与否,与 Java 的前途命运息息相关。

其实这场变革已然悄悄开始,比如说一个小点:

大多数运行期对字节码的生成和修改操作,在 Graal VM 看来都是无法接受的。

但是比如 CGLIB 就是通过运行时产生字节码(生成代理类的子类)来做动态代理的。

这是目前的主流形式。

现在因为Graal VM 支持不了,所以必须由和框架一起来共同解决。

因此自 Spring Framework 5.2 起,@Configuration 注解中加入了一个新的 proxyBeanMethods 参数,设置为 false 则可避免 Spring 对与非接口类型的 Bean 进行代理。

同样地,对应在 Spring Boot 2.2 中,@SpringBootApplication 注解也增加了 proxyBeanMethods 参数,通常采用 Graal VM 去构建的 Spring Boot 本地应用都需要设置该参数。

可以看到的是为了推进 Java 生态向 Graal VM 兼容,Graal VM 主动拉拢了 Java 生态中最庞大的一个派系:Spring。

这即使壮士断腕,也是唇亡齿寒。

而我最喜欢的还是技术演示工程部分,并不是架空了去谈,而是直接把项目 Demo 都给你准备好了,开箱即用:

我不服!这开源项目居然才888个星!?

我发现周佬写的这个开源项目还有个特点,引用的部分会给出具体的官方的地址。严谨又权威,比如写到项目中用到的技术组件的时候:

我不服!这开源项目居然才888个星!?

真心推荐大家收藏起来,系统学习。

一个问答

在项目里面,我还发现了一个问答。

问题和回答都非常的好,搬运过来给你看看。

评论区:https://icyfenix.cn/methodology/forward-msa/prerequest.html

问题如下:

周大哥,看到了您说的马太效应。再联想到之前您讲的软件涅槃,而完善的微服务体系允许服务有涅槃的过程,有强大的容错能力。微服务发展又如此迅猛,觉得马太效应真的不远。

我不禁对最需要掌握的技能进行了思考,并产生了更强的焦虑感。

我是一名有七年工作经验的java开发工程师,28岁,目前在一家北京的传统信息软件技术公司,工资相对计算机行业偏低。

局限在java语言来说,jvm调优与并发编程等比较高阶的能力,是不是就很不关键了?

jvm我读了您写的《深入理解Java虚拟机:JVM高级特性与最佳实践》的第二版与第三版,由于工作中鲜有机会实践,只停留在一些理论理解,而缺失实践,理论知识也会淡忘。

并发编程读过《Java并发编程实战》,对并发编程有些了解,也有一些实践,一般水平。

微服务公司并没有用起来,实践经验也缺少。远程调用、分布式事务、注册中心、配置中心、熔断、限流等知识,通过看视频跟您的这个文档有一些了解。

java基础知识,经过这些年的磨练,是挺扎实了,spring能熟练使用。

常用设计模式有了解,也理解的比较到位。

我不想沦为螺丝钉。

我应该提升自己的哪些能力呢?

这些年只是做到了胜任分配给自己的工作。

现在发现自己缺少前瞻性思考,缺少对自己职业生涯的把控。

我现在想把握自己的职业生涯,请周大哥给一些指导。

我会通过招聘市场去挖掘市场需求,做整理,进行思考。

但是迫不及待的想跟您述说一下,请您不吝赐教,希望我的请求不是很唐突。

这个问题其实是很具有普遍性的:学了没地方实践,慢慢就忘记了。理论学了一大堆,聊起来可以谈笑风生,但是就是没有实际使用过。自己就是一颗螺丝钉。

周佬的回复如下:

写这文章不是为了贩卖焦虑,我也没有能力指导别人的职业生涯,但针对“应该提升自己的哪些能力”这类问题,我以前被问过很多次,这里可以重复一下。

我的建议就两个:

不要轻视不直接产生实践价值的知识;
不要对陷入已经被你熟练掌握的技术中不能自拔。

为了便于你理解,我做一个很土的比喻,把程序员提升自己类比成武侠中的练功,软件中的技能其实有很明显的“内力”和“武功”之分,譬如你提到的Java虚拟机,这类知识不仅是你在工作中鲜有机会实践,我也是差不多的。

大学计算机课程中,以“原理”二字结尾的课程,譬如计算机原理、操作系统原理、编译原理、数据库原理,等等,对绝大多数人而言,都不太会去设计处理器逻辑电路、设计程序语言和编译器,开发操作系统内核。

这些都有很经典的书:编译原理的龙书,计算机体系结构和程序运行的CSAPP,分布式与数据库原理的DDIA、操作系统原理的MOS,等等。这些书系统严谨全面,但可读性并不优秀,在B站/Coursera刷这些书作者们的公开课翻译视频也许是更好的方法。

这些技能能够辅助你去思考和分析问题,但是很难直接为你解决生产中的问题,以实践价值,就是以工作中是否有机会用到来衡量它们的作用是不合适的。

但这些课程之所以会是必修,是因为学习它们,能够为一名程序员的知识框架构筑好基础。

这话听起来很教条,可是当你一旦建立了相对完备稳固的知识框架,发现遇到的新知识、新技术,能够很自然地安放在已有知识体系的某个位置上,能够清楚感知到语言、技术、框架的设计意图和目标,甚至能共鸣到设计者当时所想,就会产生一种理所当然的感觉。

这样你接受新知识的认知负荷就会比别人更低,掌握起来更快速,理解起来更深刻。

我在这文档开篇中所说的,写这部文档是以整理自己的知识框架为目的,并非场面话,这点的确就是程序员如何学习新知识的关键,在知识快速迭代IT业界,这也是决定一名程序员能力上限有多高的根本因素。

相对的,那些具体的、用来解决生产中问题的技术和方法,譬如你提到的Spring、设计模式,我将其类比为“武功”。

这当然也是重要的,只有内力没有武功无法行走江湖,空有一身理论,但写不出代码来(包括那些只定大方向的架构师、设计者),我认为不肯定是合格的程序员,也很难指望能成为一名出色的技术领导(难以服众)。

但是具体的“武功”应该是能够快速捡起的,也能快速“忘掉”的,就是避免将一件事情做熟了,就一直陷在这件事情里面,避免拿到一把好的锤子,就看着一切问题都像是钉子。

很多程序员都抱怨,自己是CRUD Boy,自己在业务逻辑中打滚,没有机会接触底层的或者前瞻性的技术,所以自己技术难以提升。

这里当然有客观原因的存在,但往往也是受到了主观原因放大。

程序员其实与旧时代的手工技艺者差不多,骨子里就有天生的技术崇拜,你写的代码比别人的优雅健壮高性能,你杀BUG比别人快速干净利索,就会受到大家的认可。

很自然地,更多偏向技术偏向深层次的工作就会落到你这里,至少你会有话语权,有选择做哪些事情的权利,是否要一直在围绕着你最熟悉的业务去打滚是由你决定的。

学习武艺成为“武林高手”,是成为大BOSS之后才不必长期面对虾兵蟹将的纠缠。

学习一门具体的技术,也是为了用它解决好问题,然后把它忘掉,去掌握那些更深层次的、更前沿,而且自己还不会的技术。

最后还有个追问和回答如下:

我不服!这开源项目居然才888个星!?

不知道你看到这个回答后的感受是怎么样的。

至少对我而言,振聋发聩。

特别是这两点:

不要轻视不直接产生实践价值的知识;
不要对陷入已经被你熟练掌握的技术中不能自拔。

已经放入手机标签中,时常提醒自己。

与君共勉。

最后说一句

最后再放一次开源项目的地址:

https://icyfenix.cn/

— EOF —

转自:https://mp.weixin.qq.com/s/8ASb7Aod6DAnIyW02TXfUQ

雷军做程序员时写的博客,太牛了!

原文链接:blog.sina.com.cn/leijun

这篇文章是在雷总个人博客看到的,里面聊到了他作为程序员的一些经历、初衷以及思考。写的不错,转来给大家看看。

如果程序人生的话,这条路太漫长

我并非天生喜欢写程序,上高中时也没有想过程序员的生活。

我学电脑非常偶然,小时好友上大学时选择了计算机系,为了和这个朋友有更多的共同语言,我也选择了计算机系,开始步入程序人生的道路。

当我学会一些后,发现自己特别喜欢写程序。我是八七年上的武汉大学计算机系,大一下学期才有专业课。当我有资格上机的时候,发现电脑世界太美妙,就一头扎进去。

当时用的是 Motorola 68000 (相当 于 Intel 8088), 540K 的内存,运行的 UNIX 操作系统,八个人一起用。

大二学PC,又过了一学期,开始出现在老师的实验室,帮忙干活,当时就写了现在很多人用的 RI (RAMinit, 清内存的小工具, 看来我还是最早一批写 Shareware 的人)。

又过了一个学期,开始和校外的公司接触。大二暑假,也就是1989年8月,和一个朋友组建了 Yellow Rose 软件小组,写了我第一个商品软件 BITLOK 0.99。后来自己创业办过公司,也写过一些其他的软件。

大学毕业后,分到研究所,不太适应那里的气氛,就在1992年初加入金山软件,开始了职业程序员的生涯。后来成了金山软件研发部门的主管,但我一直都是一线的程序员。

编程的感受

程序员活在自己想象的王国里

我刚接触电脑就发现电脑的妙处,电脑远没有人那么复杂。如果你的程序写得好,你就可以和电脑处好关系,就可以指挥电脑干你想干的事。

这个时候你是十足的主宰。每你坐在电脑面前,你就是在你的王国里巡行,这样的日子简直就是天堂般的日子。

电脑里的世界很大,编程人是活在自己想象的王国里。你可以想象到电脑里细微到每一个字节、每一个比特的东西。

我爱编程这个工作,可以肯定我会干上一辈子

不少人认为程序员最多干到三十五岁就可以收山换环境了,脑子也差不多该歇歇了,体力也不支了。并认为写程序是年轻人的事情,到了一定岁数,估计没什么人再当程序员了。

当我刚有一点本事的时候,我也和大家一样觉得编程辛苦,也想三十岁后干别的。当我年长一点后就发现了自己的无知。

一个人大学毕业就二十一二岁,有点水平的时候可能二十五,接着就是过日子诸多事情。一切搞掂的时候,也许就是三十五岁。如果这样的话,我们就不用选择程序人生的道路。

电脑进入中国时间并不短,但真正大规模开始用,还是八五年 PC 开始的,因此国内真正写电脑程序的人最长也就写了十几年(不知道是否还有这样的人)。

由于电脑应用在国内时间比较短,国内开发的主力是三十五岁以下的年轻人为主。但这不表示程序员如同红粉佳人般的容易衰老。美国主力工程师以三十四十多岁的人为主。

开始的时候,我们觉得我们没有什么不能做的(现在还能听到这样的豪言壮语),而且更要命的是好象我们特别聪明,特别适合开发软件,比老外强得多。

当我们真正接触那些杰出的开发人员的时候,发现他们太厉害了,都有十多年的开发经验。虽然也有很多年轻人做了很多好东西,但决大多数的产品出自这些有丰富开发经验的程序员的手。

刚毕业的时候,编程不仅仅是爱好,而且也成了一辈子的工作。整天不知道写些什么东西,觉得特别没劲,找不到感觉,特别灰心。

后来,才明白,只有全身心地投入,程序才会有感觉。

写程序的活特别费脑子,也特别累,但我喜欢,可以肯定我会干上一辈子,虽然我没有打算一生只干这一件事。用一生来编程序是一件既容易又困难的事。

如果碌碌无为,为交差写点程序,这样的日子太好混了。但如果想全身心地写程序,写十年就不是一件容易的事。

现在我不少朋友都洗手了,有时我也想“用什么电脑呀,Windows 外的世界不是也很大吗?”。

面对电脑的时候,立刻顿悟:写程序还是自己最擅长的事,也是最喜欢的事。

高级程序员不是追求的目标

有的人学习编程技术,是把高级程序员做为追求的目标,甚至是终身的奋斗目标。后来参与了真正的商品化软件开发后,反而困惑了,茫然了。

一个人只要有韧性和灵性,有机会接触并学习电脑的编程技术,就会成为一个不错的程序员。刚开始写程序,这时候学得多的人写的好,到了后来,大家都上了一个层次,谁写的好只取决于这个人是否细心、有韧性、有灵性。掌握多一点或少一点,很快就能补上。

成为一个高级程序员并不是件困难的事。

当我上学的时候,高级程序员也曾是我的目标,我希望我的技术能得到别人的承认。后来发现无论多么高级的程序员都没用,关键是你是否能够出想法出产品,你的劳动是否能被社会承认,能为社会创造财富。成为高级程序员绝对不是追求的目标。

编程不仅仅是技术,还是艺术

有人认为编程是一种熟练工种,也有人把编程说成是艺术创作。这两种意见争论比较激烈。我们换个工种来看,石匠应该是熟练工种,属于工人,更和艺术似乎沾不上边。但正是这些石匠,给我们留下多少文物古迹,如乐山大佛、莫高窟等等。应该说这些石匠给我们留下了无穷的文化财产。

现代软件工业已具相当规模,很多软件的完成需要的是大兵团作战。一名普通程序员接受编写某一模块的任务后,往往只是写代码,发挥的余地很小。

在大项目中,很多程序员只能了解到和自己所编模块相关的很局部的细节,另外还受到开发环境的限制,真的很难体会到自己在从事”艺术”创造,更多的时候是感到自己在从事重体力劳动。

有的时候还担心自己苦苦参与的这个项目究竟有没有意义,是不是在同类产品中有竞争力,会不会开发出来以后就因为硬件的发展,操作系统的换代而过时……

我认为编程的工作和石匠比较相似,有技术活,更多的是体力活。不管怎么说,写出一个好软件不是一件容易的事。

这两种想法都有片面性,编程应该说两种属性都有。

编程不仅仅是技术,也还是艺术。

编程是技术活,才有可能大规模进行,才会有软件工程和软件工厂。

也正是编程是艺术,才会有如此多的好产品,让大家如痴如醉。

转自:https://mp.weixin.qq.com/s/ljXpb61Zj-8cSBr4Hwmb6g

当程序员们决定去考公

每日人物(meirirenwu)原创
作者 | 易方兴
编辑 | 赵磊

北漂三年的程序员徐子龙,在今年做了一个决定:回家考公务员。他在正式决定考公后,在老家市区买了一套房子,首付30万,120平米,决心在考公上岸后住进去。

徐子龙对“拥有一套自己的房子”抱有强烈的渴望。在北京三年,他搬了六次家。第一次是实习期,2000块钱,租了个10平米的单间,每个月实习工资刚够在北京生存;第二次是毕业后工作,住在林萃桥,房租每个月2400块,住了一年房东不续租了;第三次又换房子,住了三个月不到,房东要把房子卖掉;第四次搬到了亚运村,房租已经涨到了2700块,还是个群租房,隔壁室友每天晚上吵架,他又搬走了……搬了六次家,每次房租都会涨,房间面积却始终是10平米。

徐子龙每次跟新同事聊天,他都要问对方买房了没,买到了哪,好做参考。但最后他发现,周围像他这样的大厂底层程序员,要想只靠自己在北京首付一套房,几乎是做梦。最终,对房子的渴望超越了留在北京的决心,剩下的出路,就是考公。

也有程序员因为爱情去考公。苏雪的男朋友在BAT某厂当程序员,负责小程序开发,手机必须随时保持on call的状态,不能静音,要远离信号不好的地方。苏雪有一次想去山里露营,怕山里没信号就一直没去成。有一次两人约好看电影,刚到电影院门口就来了需求,等他处理完工作,苏雪的电影也看完了。

两个人的时间总对不上,苏雪每天都会问男朋友能不能按时下班,偶尔得到肯定的答复,男朋友却又在临近下班时收到新的需求,打乱苏雪的安排,两人不知为此吵了多少次。有一次苏雪问男朋友,“不加班行不行?”男朋友说试试,每天准点下班,结果那一周的绩效全组倒数第一,接着就是部门leader找谈话,说一些“每个人的努力公司都看在眼里”“你年纪也不小了”之类的话。

在大厂内部,程序员35岁的话题经常被聊起,许多程序员的一个基本共识是,如果到了35岁还在底层混,那就基本没戏了。而且,一个人越逼近35岁,生活的本来面貌将会看得越真切,这个时候会开始考虑家庭、子女、健康、买房、养老等一系列现实问题,这些现实带来的焦虑,都有可能让人对稳定的公务员心生渴望。

当程序员们决定去考公

一位37岁的程序员在网上发帖诉苦

称因年龄被优化后只能选择考公

图 / 网络

后来,苏雪和男朋友见了一个公务员朋友,那人在一个政府部门做程序员,他们震惊了:人家不用写代码,不用996,每天上班就是把服务器打开,看看网络是否正常,如果是某个运行的软件出了问题,就给软件厂家打电话,喊厂家的人过去修。见完这个朋友,苏雪的男朋友一下就投入到考公的事业中,立志上岸。

大厂难进,公务员难考。2020年,一共有15万以上的毕业生申请了字节跳动国内3000多个岗位,平均录取比例50:1;相比之下,2021年国考报名超过200万人,竞争3万多个岗位,平均招录比59:1,相差并不远。但是,十年间互联网带来的造富热潮已经过去,相比于虚幻的财富自由,许多人开始更渴望安稳。 

这是两座不同的“围城”,却有相似的故事。

当程序员们决定去考公

钱和梦想,都落空了

李飞是为了钱,才来做程序员的。他从中部省份一所985大学的核物理专业毕业,这个专业就业太难,毕业后去核电站是一条路,要么就读研,但导师劝他,“家里没钱就别读了”,在导师的观念里,理论物理太难了,需要靠其他行业或其他人资助来维持研究,也赚不了什么钱。

但李飞的家庭条件很差,母亲下岗早,家里生活很拮据。他上小学时,有一回家里只剩一碗面条,没酱油,李飞吃了一口吐了,被母亲绑在床上一顿暴打。到了中学,同学把有些磨损的鞋丢进垃圾桶,李飞问“这鞋不是好的吗?”同学说“要不你穿吧”。这话他记到现在。

后来,一个做了IT架构师的高中同学告诉他,当程序员很赚钱,工作两年就能有四五十万的年薪,他马上报了个Java培训班,开始努力成为一名程序员。

这一年是2016年,“互联网+”成为了主导商业世界的新法则,互联网就像一个漩涡,资金和人才都在快速涌入。在O2O的浪潮之下,任何商业模式从线下转到线上都离不开程序员敲出的一行一行代码。也是在这一年,“信息传输、软件和信息技术服务业” 以122478元的平均工资首次超过银行业,这意味着程序员已经站到了行业收入金字塔的顶端。

“当程序员,到大厂去”成了一种潮流。上了几个月程序员培训班之后,李飞开始疯狂投简历,每天投50份,但是985的学历就像假的一样,有回应的公司不到1%,最后只能选择去成都的一家外包公司,第一个月收入还不到2000块。

相比之下,毕业于武汉大学计算机学院的周鹏,他的程序员之路更为顺利一些。从大三起,他就去北京的一家互联网大厂实习,毕业后又通过校招顺利进入这家大厂,参与一个智能硬件设备的开发,第一年年薪就有20万以上。

周鹏是那种觉得“程序员能改变世界”的人,桌上放的全是《乔布斯传》《重构》《代码大全》这类的书。他相信程序员能够给人们的生活提供便利,学了编程之后,他写了个软件,可以自动抓取网上五月天的照片,因为从高中时代起一直暗恋的女生喜欢五月天,他把程序存到一个U盘里,把这个U盘送给女生当生日礼物。

当程序员们决定去考公

图 / 电影《社交网络》剧照

无论是李飞还是周鹏,他们都是怀着一股极大的激情进入这个行业,但很快,他们发现了一些生活的真相。

李飞觉得不对劲,他的工作是给很多手机厂商做手机系统外包,每一句每一行的代码修改,都有严格的要求,会有好几页的 PPT或者Word文档进行说明,“这基本就是个Ctrl+C和Ctrl+V的工作,你要想自己写一些代码是不可能的。”当时他与同事交流,同事抱怨,“来这里一个月也写不了十几句代码”。

“这就相当于一个不断拧螺丝的体力工作。”有一天他晚上9点半准备下班,被领导叫过去问“为什么今天走的这么早”。通常的下班时间是10点半,有时甚至能到凌晨一点。下班再晚,他也逼自己每天必须自学一小时代码。但这件事也随着领导要求每天都写工作日报而变得更加艰难,“因为你忙了一天,下班一想,感觉什么有意义的事情都没干,日报怎么写呢?”

外部环境也开始挤压李飞。都说成都这个城市幸福指数很高,但那也是对有生活的人而言。那段时间他想明白一个道理,“什么是互联网大厂?就是你听到名字知道它是做什么的,能在这些大厂工作的只占很小一部分,大部分程序员都是像我这样,在一些二三线城市里的小公司,几乎没有什么未来”。

有一回他去上海逛了人民公园的相亲角,发现有个38岁的人,还在做IT,一个月挣一万多块钱,没有生活,没有爱情。他仿佛看到了十多年后的自己。而现在,就连健康也要离他而去了,他体重增加到170斤,每天的锻炼就是午饭后绕着公司大楼走两圈。同事与同事之间也不会深交,“你和同事的关系,就像你和路边摊老大爷的关系一样,见面会聊两句,转过身就忘了。你知道他们也有不满,但他们已经不反抗了”。

周鹏作为李飞口中“能进入大厂的只占程序员中很小一部分”中的一个,他满怀激情,一副随时准备面对任何困难的架势。在进入大厂后,前半年里,他是项目组里来得最早,走的最晚的一个。他买了个折叠行军床,专门用来中午在公司睡午觉,这样加起班来更加有精神。唯一的一天休息,他会从北京南边坐两个小时车到北边参加一场技术meet up。他的同事们也都类似,朋友圈里发的都是关于项目进程的反思,或者是和某个互联网大佬的合影。

结果半年之后,项目被砍了。被砍的时候毫无预兆,他代码写到一半,部门大领导叫他去谈了个话,让他去另一个项目组报道。这半年里所有的加班、写出的所有代码就这样被否定了。最让他无法接受的是大领导说话的语气,“就像是一个人去餐馆菜点多了,说这个菜我不要了”。

坐他对面工位的一个同事在这次调整中被优化,而这同事早上才刚刚帮他带了份早饭,第二天,对面的座位就空了,第三天,一个新面孔出现在那里。新面孔开始到处找人加微信,一副斗志昂扬的样子,就跟半年前的他一样。“这就是大厂的效率,我们个体太渺小了。”那天下班,周鹏第一个离开公司,他只想回去好好睡一觉。

当程序员们决定去考公

脉脉上的“中年程序员关爱小组”有着20.9万的关注

其中最经常讨论的问题

有脱发、缺觉、颈椎受损等身体问题

图 / 脉脉截图

当程序员们决定去考公

“最好的出路”

在互联网职业社区脉脉上,很多程序员们分享着自己的日常生活,但大部分都是苦闷和焦虑的倾诉,集中在工作压力大、没时间谈恋爱、脱发、身体变差、薪资不如应届生等方面。在一个名为“大龄程序员的新出路”的话题里,大家分享着自己的转型故事,开滴滴、送外卖、转战公务员、回家去创业,有成功的例子,更多人还是处于待业或迷茫中,来寻求建议。

对比来对比去,考公好像成了最好的出路:有程序员在家打游戏,岳父看了直皱眉,考上公务员之后,岳父亲切多了,看到都笑着问“在玩儿游戏呐,多休息休息”;有程序员相亲屡战屡败,考上公务员后开始筛选女方候选人了;有程序员介绍自己的工作,亲戚听了说“哦,搞电脑的”,考上了公务员,亲戚语气换成了羡慕,“这么好的单位啊”……

时代环境也正在改变。约十年前,干互联网是一条通往财富自由之路,在一线大厂的徐子龙就对此深信不疑。他刚入职的时候,旁边工位坐着一个比他大七八岁的员工,职级不高,技术也一般,工号在100以内。他还纳闷,“这人干活也不利索,代码还没我写得好,怎么也没见leader批评”。后来才知道,这人是公司的开山元老,手里的期权值五千多万,人家都财富自由了。他只恨自己没能早出生几年。

现在,BAT都可以称之为老厂了,已经不再年轻。互联网改变了方方面面,但留给后来者的机会越来越少,越来越多的程序员像李飞一样,做着修修补补的工作,像周鹏一样渴望用技术改变世界的程序员也越来越少了。而疫情和政策,让徐子龙见证了许多在线教育公司迅速从辉煌到没落的转变,他感慨,“身在互联网,我没有安全感”。

焦虑之下,天南地北,各种背景和境遇的程序员最后殊途同归,开始准备公务员考试。

当程序员们决定去考公

图 / 电视剧《白色巨塔》剧照

决定考公之前,李飞先看了一遍职位表。他发现核物理这个专业不光找工作尴尬,考公务员也很尴尬,只能报考不限政治面貌、不限专业、不限基层工作经验的“三不限”岗位。他家住在重庆的县城,可以报的岗位在当地要么是地税,要么是警察。由于听说公务员的工作大多是“一眼望到头”,对比之下,他觉得当警察可能更有意思。

那一年有些仓促,真正留给他备考的时间只有半个月。他每天刷4个小时行测题,就这么复习了十多天,最后竟然考了140多分,笔试排名第一。大家考完出来彼此打听分数,一看他考这么高,抱怨“你这么高的分怎么还跟我们竞争这么偏僻的岗位”。他比第二名高了十分,接下来的面试只要不垫底,怎么也都进了。得知这个消息他也没有多高兴,“换个日子过而已”。倒是家里人高兴坏了,像是感觉儿子终于开窍了。

相比李飞的“十天复习上岸”,大多程序员的备考过程更加隐忍和漫长。程序员考公看似是个关于选择的话题,实则是关乎生存,这需要在煎熬中隐忍,就跟做某种敌后特务工作一样,不能让任何同事发现,要和996争夺时间。

每个人都有自己的办法,同时,也不是每个人都能成功。

为自己房子奋斗的徐子龙,备考之后买了个镜子。互联网公司9点上班,他6点就起了,第一件事是对着镜子读《人民日报》《新华时评》,最开始的几天坐在床上读,读着读着睡着了,后来强迫自己站着读。去公司的地铁上,就用手机看学习强国APP。

在考公最后一个月,他每天刷一套题,在工作上,基本上就放弃了这个季度的绩效。这些努力换来的是笔试第三的成绩,成功进了面试。但第一次面试时,当9个面试官像一面墙一样坐在他的面前,他还是慌了,没能翻过这堵墙,最后逆袭失败了。

苏雪的男朋友在决定考公后,苏雪第一时间到网上去给他买了全套的考公资料,程序员通常只有晚上和周末备考,所以两人周末唯一一天约会日也取消了。就连准备用来旅游的一万块钱,也报了考公复习班。

第一次去考的时候,她陪男友先考了个杭州的事业单位试水,考点在一所中学,看到2000多人争夺一个岗位,吓得差点放弃考公。现在考的次数多了,遇到什么场面都不慌了,苏雪坚信他男友未来肯定能上岸。

而周鹏则是在整个项目被砍后决定考公。他看上去没什么变化,仍然是每天来公司最早的那一个,只不过以前是来写代码,现在是躲到另一栋办公楼的某个会议室里看行测。次数多了也会被怀疑,有同事问他打卡这么早干什么去了,他就说健身去了。他还学会了掌握部门leader每天的动向,只要leader一去开会,他就溜出去刷一会手机上的行测题。这样在leader眼里,他每天都在工位上。最难的还是下班太晚,回家要顶着困意复习到12点。在公考最后一个月,报了个面试速成班,他睡觉做梦都梦见自己在模拟面试。最后他成功了。

当程序员们决定去考公

认清生活的真相

李飞终于过上了他想要的稳定生活。当上警察的第十天,他站在重庆某个乡镇的街道上,穿着有些陌生的警察制服,保护一起凶杀案的犯罪现场。

这就是他的新生活。跟程序员是两个世界。在乡镇,这样的杀人案可能几年才能遇到一次,这也是他能立功的宝贵机会,但由于他是新人,机会轮不到他。除此之外,都是一些民事案件——某个市场丢了100多块钱的钢筋,或是街头两个大妈吵架需要调解。

虽然工作比较无聊,但别的地方也都还不错。稳定,没有35岁焦虑,派出所里有免费食堂,雇了个当地川菜师傅过来做饭,吃得很香;社会地位高了,当地谁都想跟派出所搞好关系,办事时总有人想请他吃饭;所长隔三差五给他介绍相亲对象,虽然他都没看上,但也不妨碍他成为当地相亲市场的热门人选。

他第一个月的工资发了4000多块钱,几乎全都寄给家里,还花了1300块给母亲安了个净水器。这在当程序员时是不可想象的。他体重从170斤瘦到了140斤,连腹肌都有了,每周都能回家,还准备在重庆买房。

对有些程序员来说,公务员生活几乎是完美的。今年年初,3位已经进入体制内的前大厂程序员共同发布了一份《程序员考公指南》,称这是互联网上第一份相关指南。在《指南》的开头写着:“3个来自同一家大厂的程序员组团在职备考一年,上岸成功率100%,后端阿强考上了一线城市深圳的公务员,前端阿珍进了离家车程10分钟的事业单位,我在老家省内高校当教师:我们都有光明的前途。”

《指南》中的阿强颇具代表性,他对比自己考公前后的生活,觉得幸福感满满。以前他花一个小时去公司,现在开车5分钟就到单位;以前中午花20块钱吃食堂,现在花2块钱去饭堂吃自助;以前中午只能趴桌子眯一会,现在能开车回宿舍洗个澡、睡午觉;以前下午继续写代码,现在下午聊会天、喝喝茶、写材料,很快过去了;程序员吃完晚饭要继续开技术评审会,公务员17点58分已经排队下班打卡了;等到程序员晚上11点终于下班到家,公务员已经逛街回来,玩了一会游戏,健完身、看完电视剧准备睡觉了。

当程序员们决定去考公

《程序员考公指南》创始人之一

在网站上分享自己的考公作息时间表

图 / 网络

但总有无法习惯这种生活的人。33岁的刘东之前因为带娃时间少,媳妇总跟他抱怨,于是他考上老家附近的编制,工资只有大厂的三分之一,但离家近、稳定,他终于有时间陪娃了。

在端起铁饭碗之前,他把积累下来的几个星期的年假一次性休了,休年假的第一个星期他很快乐,拿出了尘封多年的吉他,每天从早到晚,要么弹吉他,要么陪娃,心想自己终于有了生活。到了休年假的第二个星期,他开始焦虑、失眠,“我下辈子真就要这样吗?”在最后一刻他反悔了,找到自己部门的leader,说“我不想去了”。现在,刘东成了公司组里最勤奋的一个,“先挣钱再说,35岁失业我也认了”。

李飞也无法习惯。在同事里,他像个异类。他喜欢看书,其他的同事的娱乐方式是打牌或是干别的,他融入不进去。而且公务员需要写很多材料,有些人材料写得很好,但他写材料时很痛苦。由于没机会立功,这意味着他要在这个乡镇派出所继续干很多年。公务员人际关系复杂,应酬频繁,他常常怀念起程序员时那种一个人做事时的单纯和专注。

这时候,有个朋友出来创业,正好缺个程序员。在当警察一年后,李飞再次离职,又回去做了一名程序员。

罗曼罗兰说,生活中只有一种英雄主义,那就是认清生活的真相之后,依然热爱生活。这次他的目的地是上海。他卖掉了重庆的房子,靠着之前的工作经验,如今已经进入一家某领域头部的上海互联网公司,实现了从小厂到大厂的跨越。

从稳定中重新回到了奋斗的状态,李飞有了新的体会。他觉得一直写代码,写到超过35岁也是一件美好的事,“优秀的程序员写出的代码,你能感知到一种建筑式的美感,而不是干巴巴的,像是村里的施工队搭的房子”。

现在,他正在朝着这份“代码之美”努力。另外,他又胖回到了190斤。

文中受访者均为化名。
本文转载自【每日人物
 
当程序员们决定去考公

转自:https://mp.weixin.qq.com/s/ef31MqDvzNaU5-il5KSumw