写代码究竟酷不酷,不是程序员自己决定的,是由需求决定的。
给你一个枯燥无聊的需求,就怎么也酷不起来了。
我写代码快20年了,能称得上酷的需求,大概也就2-3次吧。
是啊。裤毙了。
啊?没写白字。就是裤。裤衩子的裤。
当年果壳还没植物化之前,网友们曾经是能发帖的。当时不是很流行手工给女朋友造点精致的好玩的玩具表达爱意嘛,就有一位壳友在上面发帖直播。他打算用钛合金给女友做个戒指。女朋友听说之后也挺有兴趣。
下料、钻孔、切割、打磨……
一天天过去,一道道工序落实下去,手上磨出了血泡,戒指的样子也渐渐显现出来了。
然后突然有一天,小伙子没精打采的发了个帖子:吹了。她说我见台虎钳比她都亲,一天到晚也不知在上面捣鼓些什么。
后来我在知乎讲这个故事,又引来一票不知人间疾苦的女士,说这小伙就是个白痴。
为什么白痴呢?
1、他应该给她讲明白自己在做什么。
——她知道的。更细节的她听不懂,也没兴趣。
2、他可以一边做戒指一边和她聊天。
——劳动工具很危险的。就不说吊儿郎当肯定一做就坏了;敢稍有分心,付出的轻则几滴血,重则一根手指。
——我还搜出长江三角洲那些工厂一年的工伤数据。每年三万根手指。
3、根本不需要那么久。这小伙可能不知道有个工具叫车床。
——你怎么用这玩意儿造戒指?哪个位面的车床这么牛逼?
4、总之就是他的错。你看外国小伙子给女朋友做那么漂亮的复古首饰盒不也没散嘛。
——因为人家的女朋友耐得住性子,等得起这份爱心。
5、我不管你不对,反正绝对不可能像你说的那样——不会需要那么认真,不会需要那么多天……
——她们大概只见到了剪辑过的快镜头。既然视频不能PS,既然人家那么复杂的东西不到10分钟能搞定你这个也绝对不可能需要十天。
实木首饰盒的制作过程,看完的小伙伴请冷静_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
总之,事情显然超出了这些阔太太贵小姐们的认知范围——做戒指,不应该就是拿个什么玩意儿压一下敲一下就好的吗?总不能比淘宝买一个寄过来还慢吧?
别说做手工不酷,玩游戏一样可能很“裤”。
话说俺刚工作时和某大学同学合租。大学时比较喜欢玩游戏,基本就周遭网吧一霸,本校没有敌手那种。他也经常掺乎着玩玩,但水平极其一般——基本就当年跟着我们跑的几位同班女生都能随手捏死的水平。
当时的网络都还普遍是56k猫,ADSL都还是新鲜物事;因此周末空闲时间我就找网吧玩CS。这位同学就屁颠屁颠跟着。
但工作/租住的地方略偏僻,得走十来公里路才有个大学,那附近才有网吧。
我那时走路飞快,基本就竞走的架势。他慢跑跟吧,跑不动;但想和我并肩走就得不停找话聊,这样我才会有意识控制走路速度;不然一旦专心走路,稍微一走神他就被拉几十米开外了。
总之,经常和他聊着聊着一不小心就看不见人了。再一看,落后百十米了。只好停下,看他一溜小跑追上来。
走路走的太辛苦了,他就和我抱怨:“你说我这过去干嘛啊……一路跑的……呼哧~呼哧~”
我就笑:“快到了。到了我带你虐人玩。”
他:“拉倒吧。跟着你跑根本就看不到人,全被人杀了;跑另一边就被一群人打。哎~你说你过去是虐人玩,我跑的腿都麻了,过去给人虐……”
我大笑:“给你讲个笑话。说有个法警押解犯人上刑场。犯人就抱怨,说这年头死一次都得走这么远的路,太难了。法警说你知足吧,你到地方就不用回来了,我还得往回走呢……”
这位也大笑,说你等着,咱到底看看谁枪毙谁。
到了网吧,他气呼呼的加我对面,说要“制裁”我。
上大学时还有几个同段位的牵制,他偶尔能瞎猫逮个死耗子,枪口下没少躺过“高手”。因此觉得一下午怎么也能占到几次便宜。
但那家网吧附近的大学没高手。他们曾牛气哄哄的搞了个战队,让散人都去当匪。结果被我单人独枪屠了一遍又一遍,彻底打的没脾气了。以至于干脆给服务器加了锁,只和他们自己人打——这是后话。
总之,那天我1v5,杀了50:0。这位重复了一下午的买枪,冲,什么都看见就躺地上了;然后继续买枪,冲,什么都没看见就躺地上;继续买枪,冲……的无聊循环。
中间还有个小插曲。有人大概见我这边人少就加了我这边;结果跑了五六局,都是连人都没见到就被我杀光光了。于是他一怒跳到对面,和这位同学一起被我刷人头记录去了。
其实之前和他打我都有放水;但那天和他杠了下,打的认真了点……
再后来他就坚决不去了;于是我们的周末安排就成了“周六下午一起逛电脑城,周日我一个人跑上一个多小时的路过去虐菜”。
又过了半年左右的样子,我们住处附近终于开了家网吧,走路过去再不用那么辛苦了;但这位老兄终于还是拒绝了网吧。大概是被虐出心理阴影了吧。
你看,玩游戏其实也一点都不酷,除非段位相近。不然无论单方面虐与被虐都很容易“裤”。
大裤衩子的裤。
好了,终于说到“写代码”了。
简单说,写代码这件事可比设计出来就是给你玩的游戏“裤”太多了。
有多“裤”呢?
举个简单的例子吧:你一定在电脑/手机/网页见过一个个的窗口(或者所谓的“悬浮窗”),这些窗口可以到处拖动、会彼此遮挡……
你一定会说:“切!这有什么稀奇的!窗口嘛,天生就该是这个样子!”
很遗憾。它并不是“天生”就是这个样子。
在程序员的眼睛里,你的手机/电脑屏幕是一排排的“彩灯”;这些“彩灯”一行有4096组、整个屏幕足足有2160行——换句话说,一共4096X2160=8847630组小彩灯;每组小彩灯又由三盏分别为红绿蓝的小灯组成(这就是所谓的RGB)。
显示画面就相当于要求程序员控制这近九百万组、两千六百多万盏小彩灯,用它们拼出想让你看到的图形——每秒30帧的动画呢,就需要每秒钟输出六亿个色彩信号。
这还没算每个色彩信号还有8个二进制位、255种不同取值。
稍微错一点点、或者效率差一点点……
好了,还说回“窗口彼此遮挡”这件事吧。
对做GUI库、负责窗口绘制这块的程序员来说,这就相当于要求他们根据窗口的前后关系以及大小状况、让这4096X2160(或者2048X1080或其它分辨率)组“小灯”的点亮状态恰好和“QQ挡住了浏览器右侧”效果相同。
你可能会说,简单!只要让浏览器先“画”,完了再让QQ“画”,只要QQ别碰自己窗口外面的区域,那么最终效果就符合要求。
没那么简单。
前面说过,对4096X2160@30HZ的情况,这相当于每秒处理六亿个色彩信号。如果用户打开了十个窗口,你敢让它们都重画一遍,那可能就是每秒六十亿个色彩信号。
这个压力,哪怕对现在最好的CPU,都不是个小任务。
怎么办呢?
没错,要区分画面有无变化、也要区分遮挡关系——画面无变化的窗口就可以不重画了;被遮住的窗口也不需要重画……
但是,等等!
1、假如窗口A被B遮住了一半,当它的内容有变化时,是应该全部重画呢,还是?
2、假如窗口A被B遮住了一半、它的内容也没有变化;但窗口B被移动了,使得窗口A右半拉被遮住的地方能被看到了。怎么办?
有一个方案是,如果B遮住了A,它要把A被遮住的部分的图像找个地方保存下来;当B移动时,先把B删除、再把自己保存的A的遮挡部分图像画回去;然后再把B下一步要挡住的部分找地方保存下来、再把B画上去——这被形象的称为“异或”(只是个比喻,并不是简单的异或算法能解决的)。
这个方案的缺陷是,如果A的内容变化了,B还画之前的内容,就会造成A的显示错乱。
另一个方案是,操作系统发ReDraw消息通知窗口重绘时,顺带告诉该窗口:你哪哪的画面之前被人挡住了,现在最好重新画上一遍。
顺带的,操作系统可以先计算窗口的遮挡关系,然后给所有能看到的区域发ReDraw消息;消息参数中的invalidRect就是需要重绘的区域——看不到的地方就不发这个消息了。
当然,这需要写窗口程序的程序员积极配合,根据invalidRect自己确定窗口中的哪些内容需要重绘(做事比较糙的也可以忽略这个invalidRect参数,重绘整个窗口;但这样就可能引起性能问题;因此GUI系统最好还是能保存每个窗口的旧内容,只要窗口没有重绘、单纯的被遮挡/遮挡取消就不需要劳民伤财的重绘了,拿保存的内容“贴”回去就是)。
哎呀一不小心说了这么长……其实还有好大好大一砣子东西没说呢,这图形学啊……算了,打住打住。
总之,就这么点皮毛,它需要多少背景知识呢?
不扯别的,就说最简单的吧:窗口的Z轴排序,这个用什么做?
链表?单链表可不好排序,除非归并……
一个窗口里面又可能有一堆子窗口(按钮、输入框其实都是子窗口),这又该怎么记录?
树?
有些程序需要支持“点击任意位置拖动”;那么实际上就应该是“从主窗口这个根节点开始、同时移动下属的所有子节点、孙节点……”
窗口还能缩放……
然后,窗口彼此遮挡区域又怎么计算?计算器这个程序里面有几十个子窗口,它和同样一堆按钮的播放器之间的遮挡关系如何处理?
打住,打住。太多了,会把读者们吓跑的(可我还没敢说半透明效果呢 0.0)。
你看,一砣子数据结构,一砣子算法——而且都没有什么现成的可以用,都需要你随机应变、把本科二年级学过的那些算法/数据结构随手拈来、任意改造,然后才可能搞定这件“小小的工作”。
前些天我说国内教育不行,绝大多数人四年连大一水平都够不到;大二水平都是天花板。结果被知乎删了,不让说。
但是……
如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题?
你看,就是连大一水平都没达到、踮着脚作着弊都够不着大二学算法的门槛嘛。
点到为止。不然知乎又要删了。
总之,这么简单点功能,需要的知识已经是一些阿里P7生命不可承受之重了;但哪怕再下降几个段位、日常搞搞增删改查,这工作照样能刷下一大半的计算机专业本科生。
——想想那位陪我走十多公里路到游戏里“接受枪毙”的可怜菜鸟。
——对外行甚至某些阿里P7来说,还不如那位菜鸟呢。起码那是游戏,动动脑筋还真有可能阴到一次。
你看,这玩意儿拿出来给外行看……能不“裤”嘛。
专业到让你像遇到高数老师一样一脸懵逼:我在哪?我在干嘛?你们在讨论什么?等等,我需要醒醒酒。啊?没喝?但我咋觉得断片了呢……
更大裤衩子的是,这个大裤衩子……你觉得得多久才能做出来?
哪怕一个很不完善的、性能一般般、刚刚能完成功能的demo,说一个月都算太过乐观!
事实上,九成以上的本科生……你给他四年他都搞不定——算法与数据结构学会了吗就敢来掺乎?
别说一个月了。大年初一他消失了,正月十五兴高采烈的蹦出来:哇!我搞定了窗口遮挡算法!
你是觉得“哇!好酷啊!”呢,还是“我套你个大裤衩子!我的植物大战僵尸呢?半拉月了,你钻电脑里撬都撬不出来、饭也不吃觉也睡不香,就拿出个这?就这?就这?”
没错。除了什么用都没有、功能极其单一效果极其弱智的沙雕小程序,一个程序员一个月能给你拿出来的、自以为很“酷”的代码,就特么是这么个半成品的、屁股蛋子都遮不住的大裤衩子!
你看,带你玩游戏段位差太远还一点意思没有呢,这玩意儿居然还敢像高数一样善于挂人、还要把它当成日常,这怎么酷的起来?
就这样已经够受了;它还像工科一样,得聚精会神砸进去大量时间、消耗您不多的耐心;砸出来的呢,还只是只丑小鸭……
绝大多数行当并不适合表演,演出来都是大裤衩子——很卖力很卖力的折腾好久、兴高采烈拿出来献宝……然而越“高级”的东西拿出来时就越不会“酷”,就好像高数是吊人的绞索而不是什么优美的诗词、挫戒指弄得手指脏污粗糙又长时间躲在工作间不出来、抽象派艺术又丑又怪一样。
很多行业和处理身边事的律师行业不一样,它的日常工作内容相对于绝大多数人的经验世界太过“超纲”;超纲到连人家的基本工作内容都没法理解。
想要外行们觉得“酷”,那么往往就不得不制造戏剧冲突、把复杂的思考博弈决策浅薄化、表面化、形象化,甚至不惜把它变成完全不同的、另外的东西。比如黑客大战就只能拍成网络里的人格化角色乒乒乓乓一阵乱打,挂着黑客的名字,拍的却是拳击比赛或者魔幻片;再比如诸葛亮的内政才能没法拍,只好拍成妖道;关羽张飞行军打仗怎么开作战会议怎么指挥怎么用兵没法拍,没人看得懂,只好让他们骑马单挑……然后就会有很多人说:啊,真酷!
很遗憾,但这还真不如叶公好龙呢。毕竟叶公好的起码沾点边、起码叶公见了龙还知道那是龙;但这些东西嘛……别说什么形神了,那是完完全全的没半点关系。
哪怕失真到这种程度,这些领域起码还有人与人的对抗可以“利用”——不沾边就不沾边,铁拳无敌孙中山,打的热闹就行。
但更多更多的领域,那是连打都没得打。
就说这程序员吧,最好的程序员甚至连聘用他的公司都可能不知道他能力很强——恰恰相反,蹩脚程序员天天捅篓子看起来事情最多最忙碌公司最离不开,而优秀程序员呢……吊儿郎当的,随便你交给他什么他随手就给你搞定了,多难的问题都耽误不了他的吊儿郎当,也不会让公司感觉到他在这里解决了什么难题——就好像我给你们讲这个窗口管理的故事一样,当你看着一群不懂算法的P7吹的天花乱坠之时,可曾想过那个默默解决了这个等级的问题的程序员得有多少知识储备?得比这种不懂算法的P7高上多少?
连行内人都满是误判错判,怎么可能指望普通观众看懂?
但另一方面,如果你水平真到了……瞧瞧程序员们用的这词儿吧……
——垃圾回收算法动作时要“stop the world”、而且还要stop的用户感觉不到、不知不觉中世界为之一清。
——黑客帝国中的子弹时间很酷?这一点都不高科技。3D场景中只需改一下interval参数,随随便便就能做出同样效果、任你360°慢镜头甚至停下整个世界任你细细观察。
——我们的祖师爷图灵,实实在在的拯救了世界。没有他们,纳粹的加密电文可没那么容易破解。
——密码学的各种认证、挑战算法,骨子里透着那么股中二气息;偏偏又触摸到了某些根本性的东西……
——程序员喜欢自称“数字世界的创世神”,看看蚂蚁能往里面搬个“蚁群算法”,翻翻生物课本就是“遗传算法”“神经网络”……形似神也似那种!连柯洁都被杀下马的那种!(当然这个段位太高,大多数程序员还摸不到边)
事实上,网络上活跃的程序员一点也不少。他们给你的印象,除了自黑,更主要的是什么呢?
没错。多才多艺。多才多艺到令一些人讨厌——我就收到过很多很多回复,要求“闭上嘴,就你们程序员讨厌,好像什么都懂一样,什么话题都少不了你们”……
——但我们的工作就是理解各行各业的知识、把它教给电脑啊。
事实上,经常的,能够精确、高效的理解客户工作流程,快速准确的捕捉到客户真实意图、帮助客户精确专业的表达出他自己头脑中一闪而过、欲诉忘言的朦胧念头、利用自己的专业知识创造性的帮助客户解决问题——他们毕竟是计算机世界的外行,我们不能想他们所想,他们自己是不可能知道自己的困难能否被机器解决、如何解决的——这,才是优秀程序员的价值所在。
在专业领域,最木讷的话题终结者反而最健谈、最能“取得真经”的;相反,“善于聊天打屁”的,事实上只是个“口若悬河的闷葫芦”——说再多都说不到点上,有啥用啊。
计算机这个行业本就是个“超级交叉学科”。因为程序员的工作就是用计算机为我们的整个世界“润滑”:兵马未动粮草先行他得懂,还得懂到能教会电脑、让计算机自动规划出(超出人力水平的)最佳方案;调兵遣将他得懂;生物体内的化学过程得懂;人体力学得懂;会计合账得懂;交通调度工艺流程……只要遇到了涉及相关知识的项目,他统统得懂——还不能是泛泛的能侃大山的懂,而是要能把计算结果拿到专家面前、让专家点头的那种懂。不然这项目咋通过验收啊?
当然,这是“能接触到需求那个层次的程序员”的硬性要求;但只要你能参与项目会议,那么你起码要对整个工程的某个局部的设计目的、工作原理了如指掌——不然领了任务回去填空(甚至增删改查)就是,反正你这也不知那也不懂,别人说话哪有你插嘴的份儿。
所以你看,程序员这个职业的确很酷,对吧。
问题是,它最酷的地方,恰恰是“理解大多人难以理解的东西、然后把它搬进数码世界、让计算机帮我们解决现实问题”——写个计算器APP,这一点都不酷;想要酷,你得让它自动解方程、求积分……
不说人话的总结一下:程序员的工作,就是抽取各种工作的元规则(meta),然后将其数字化、自动化,使得计算机可以基于这些元规则的演算去代替人完成各种脑力劳动。
这就是任何行业任何话题都会有程序员掺乎、而且还敢掺乎到该领域的专家面前、把一些人恨得牙痒痒,却就是没法阻止他们越界的根本原因——主持开发过某个领域软件的,本来就必须是该领域的半个专家,本来就必须弄斧到班门。
不然这软件,能通过人家验收吗?
于是,又回归那个问题了:为了照顾普通人的理解力,我们的文化工作者不得不给他们看“铁拳无敌孙中山”;而程序员最酷的地方呢,偏偏是“理解历史上那个真实的、不铁拳无敌的孙中山,把他的工作的思路接下来、理解透然后教给计算机,让计算机基于相同的思路帮专家工作”……
——这都不是简单的“理解工作内容”了,而是“必须抓住元(meta)思路,才能简化程序并适应更复杂的情况;一条一条的硬编码是不可能应对需求变更的”!
是的,这东西的确不是特别难。它毕竟没让程序员自己去开拓、甚至都不要求他们学习复杂烧脑的应用技巧;但你必须学会抓根本,抓不到根本就总结不出“元规则”——换句话说,理解不了一个领域的核心思路是不可能成为半个专家的。
总之,还是那个致命弱点:想要领略到“酷”,需要知道的前置知识、理顺的逻辑链条太过冗长。
绝大多数人,你让他读个长句他都“太长不看”,何况每个项目一套不同专业的元知识以及繁复的规则推演呢。
给人打工,替人写代码,和搬砖差不多,哪里酷了。酷的不是程序员,是独立工作的黑客。
漫画家很酷,动画师很无聊,也是一样的道理。
一个新手,刚上班,接到任务,从数据库读出用户信息发给前端展示。
新手跃跃欲试,先复习了一下sql知识,然后动手写了连接sql的代码,业余时间还看了什么高性能sql的数据,觉得好充实,学到很多,尤其是连上数据库的那一时刻,简直是高光状态。
接着写出一个类,心中牢记书上那些设计方法,什么工厂模式,bridge模式大显神通,代码写得妥妥当当。完美!
最后,执行sql语句,读出数据写入内存中,然后调用公司封装好的send方法,成功将数据发给了前端。新手当然不会放过send的内部实现,周末花了两天认真阅读了公司的框架代码,学到了好多tcp知识,又是充实的周末呢!
新手看着自己写的代码感觉做个程序员真的是很酷啊,心里思索着如何提高sql的性能,代码是否符合Google编程规范,算法上有没有优化空间,公司的框架背后的深刻tcp原理,成为大神就从这些开始。
周一回来上班,项目完美,新手很高兴,于是打算中午好好翻翻linux内核原理,打算借着这个机会再深一步学习,程序员嘛,要终身学习,要向大神进发!
结果正要翻alloc的实现时leader来了,说:“紧急项目,我们要把账户信息也展示出来。哦,对了,上周那个展示用户信息的地方要改改,A类用户不展示电话号码,B类用户邮件要打码,C类用户要显示英文名……如果B类用超过10个以上,A类用户名字不能出现xxx。项目紧急,今晚上线,快干活吧!”
一年后,新手脑子里都是“项目紧急上线,白加黑,冲冲冲”,“代码能用就行,赶紧写完赶紧上线”,“这不是bug是产品不行没说清楚”,“周末晚上加班后要记得去超市逛逛家里没洗发水了”,你要问他linux内核进程调度算法,快速排序优化,新手第一反应是:“什么鬼东西!刚毕业的吧?!”
提名1919席卷美国的猩红之夏。
图示是一名被处以私刑的黑人,他的尸体正在歧视的火焰中毕剥作响。
迫害黑人似乎并不那么残暴,但是这是发生在黑人解放后将近六十年之后的全国性迫害热潮。其残暴不仅仅在于对黑人的残暴迫害,更是对民主,对法治,对平等,甚至对人理的残忍暴凌。所谓的政治精英与民主卫士,正是迫害的最大推手。
不知道美国有什么脸面去说民主与平等。
(给文章点赞时麻烦给这个回答也点个赞同吧,如果能点个关注就更好了。祝各位新春快乐。)
哦,还有美国人在瘟疫时期的鬼才操作
外加一个加拿大的
那些评论烦死了!之前因为评论还被知乎制裁了,现在评论区封闭!
我随时准备见证神佛显灵,以压倒性的神迹让我五体投地。
但很遗憾,这么多年我只遇到过傻子和骗子。
保守治疗吧。
魔兽争霸和魔兽世界里的熊怪