分类 想法 下的文章

作为一个了解人工智能基本概念的程序员,我看完《The Queen's Gambit》之后,其实就少了那么一层神秘感;而且也不像推特上那么多人那样,看完之后立刻有了学习Chess的冲动。

1996年,人工智能,或者说计算机,首次击败人类Chess Grandmaster;2006年,人工智能首次击败人类围棋九段。这其间,与其说是人工智能的飞速发展,不如说是“算力”价格的快速下降,或者说“算力”的快速提升。现在一台普通笔记本中运行的“人工智能”就能打败最牛叉的人类国际象棋大师。

包括此电视剧里,女主最后赢,也靠的是背后的前男友天团集体的“算力”,他们熬夜计算出各种可能性,给女主提供各种备选答案。

所以我也没什么可说的,反而开始有了一个疑问:现在一台电脑就可以打败人类国际象棋大师了,还有人会去做职业棋手吗?围棋呢?虽然算力还没强大到一个笔记本电脑就可以击败人类围棋大师的地步,但估计也不会太遥远了。柯洁存在的意义在哪里?

人类的阵地在一片一片丧失,真的很难想象某一天人工智能可以制造人工智能,就再也不需要人类了。哪一天会怎样?

首先声明:

  • 这是在美国找工作的情况
  • 不是类似Facebook这样的大公司,虽然也是上市公司,但是和FANG不能比

第一个,就是遇到无数挫折,被拒无数,等找到了才意识到,找错了工作岗位。
我其实应该找的是Front End Developer,但我的头衔一直都是Senior Software Engineer,于是找了很多Software Engineer的岗位,面试中,很多都要求系统设计,我心说我又不做后端。而且很多时候,我联系了一下之后都没下文了;现在想来,就是搞错了职位。当然,也拿到过Amazon的Front End Developer的面试,挂了。后来终于又申了一个现在的前端岗位,果然就中了。

第二个,关于鄙视链和正视自身的优劣势。
无论中美啊,都有鄙视链。
我现在的工作中【注意定语】,前端确实没什么太高科技的东西,而且天天写CSS和JS,有时自己也挺烦。
所以一直有某种“情节”,大概就是说,好掌握几个后端的语言,Java啊,Go啊之类的,将来可以搞搞大数据、分布式、高并发啥的,听着非常高大上。

但实际上,Go语言,我学过几次,现在基本彻底放弃了,原因无他,语法怪异,平时也用不上。当然,说到底,还是后端的基础知识比较薄弱,比如不会C,没学过操作系统,等等。毕竟转行的嘛。
至于Java,我用Java练习LeetCode。Java的数据结构那是非常丰富的,非常好。

后来我研究了一下前端中比较深入的东西,才发现其实前端还是有很多可钻研的东西。而且JS只是前端的一部分而已。
比如说,浏览器是怎么运行的,
比如说,各种debug工具,chrome devtools protocol啥的
比如说,各种可以编译到JS的语言和编译器(我正在学习怎么写个编译器)
比如说,使用webassembly和c++来写出高性能的app (我现在的公司和即将入职的公司,都有非常强烈的写高性能app的需求)
比如说,自己实现一个react-like library
比如说,自己手写Promise
这个链接给了我很大启发:https://jishuin.proginn.com/p/763bfbd23be3
当然,还有stream,socket, WebGL,Canvas这些,但要看具体的需求了。
数据可视化也是一个非常靠谱的方向。

所以你也看得出来,我不算高级前端工程师,但我算一个非常熟练的中级前端工程师吧,知识面也够广,自学能力也很强,甚至带几个intern也都OK,但离高级工程师还是有距离。
总之,要对自己的水平有一个合理的评估吧。如果评估不好,你会发现,你要么申了个够不着的岗位。要么中了一个和预期薪资不符合的岗位。都不好办。

第三,说说leetcode
我个人是绝对认可leetcode的,https://space.bilibili.com/9099840
这是我的b站频道,全部都是leetcode java版本解题视频
学算法,对你可能没有直接帮助,但有非常非常大的潜移默化的间接帮助,这个只可意会不可言传,反正我现在也说不出到底具体哪里帮了我,但我现在写代码效率比以前高出N倍,而且能够经常一遍写对,不用反复console log;能够经常一眼能看得出代码哪里有问题。
Leetcode对我的帮助确实非常非常大;而且建议用Java或者C++ (我用Java),即便你是一个前端,每天只用js。Java提供的各种数据结构,看起来简直是牛逼的的不得了,比js的强多了。

当然,我练习了leetcode的本意是为了面试,但现在看来,其实对日常写工程代码也帮助很大。

第四,说说成长性
美国别的不说,就是有一点好,没有35岁限制,所以一个程序员可以持续钻研和学习,可以不用着急,慢慢发展,补齐所有短板,从而成长为一个高级工程师。
比如我自己,我本来学医的,转码,对吧,基础显然不够。
我现在在学Theory of Computation,天天研究各种DFA,NFA,pushdown automata什么的。然后下一步就是学习编译原理。再下一步,就是什么计算机组成员,操作系统,数据库啥的,油管上有很多很好的免费学习的课程。而且EDX和Course都有很好的课程,就慢慢学吧。
C、C++和Rust也是一定要学的。
还想着读一读nodejs的源码。
还有各种functional programming的东西,要学的简直太多了。

为啥有空学?因为不加班啊,哈哈。当然,有了小孩以后估计就没空了,所以还是要抓紧时间。

现在我每天起床后,立刻看一小时的上面说的课程;然后开始工作,晚上下班后,要么写点自己的东西,要么研究leetcode。周末更是全天都学习新课、练习算法和浏览github。即便我已经拿到了新offer,我还是这个日常时间安排,没有松懈。其实持续学习已经一个生活方式了。

其实也非常忙,留下娱乐的时间也不多。

而且升职路径不一定说是非要做manager,可以做技术专家,同样很多钱。我知道某个超级牛逼的大牛,跳了一次槽,工资涨了3倍。高级技术专家,永远稀缺。我老婆他们公司某个牛人,和公司按小时结算,其实也是contractor,但每小时300美元,一天工作8小时。你算算是什么年薪水平。

当然,如果说创业,去纳斯达克敲钟,在美华人去创业的不算太多,但不一定非要做CEO才算创业,也有很多人技术不错,加入某创业公司,然后拿了很多股票,虽然不是身价亿万美元,但显然可以买得起Rancho Santa Fe和La Jolla的豪宅。这也肯定算是成功人士吧。

第五,关于domain expertise
这个其实还是挺重要的,我找了一个同行业的公司,但没有直接竞争关系的公司。很多经验和行业知识都用得上。我也觉得这行业不错,准备继续深入研究一下行业知识。

最后说说钱和人生
我目前的工资,肯定是远高于国内【同级别】的程序员的(换成人民币的话),但这样比没意义,因为美国的薪资结构和中国不一样。反正收入肯定能让我在生活的很舒服。
这样的薪资水平下, 然后又不加班,就让我安心学习,安心成长,经过10年后,我相信我会成为一个真正的“大牛”。
其实,我完全可以不用学,就开始享受人生,比如出去旅游啊,搞个小爱好啊,我就有前同事有各种爱好。哎,我很羡慕的。
就是说,不用去追求更多的钱,安心过小日子就好。但内卷民族的天性,就是不停的卷,所以我停不下来。
但更重要的是,我一直觉得自己是个很无聊的人,因为我没啥爱好,也不爱听音乐,就喜欢看点美剧。
所以除了写代码,也没啥可干的。
而且自从抖音在中国和去世界都火了,我突然就发现了一个新大陆:全世界人们都很无聊,不然他们哪有那么多空闲刷抖音呢?于是,我就释然了,既然我和全世界人们一样无聊,那我就没什么可内疚的,觉得自己没有爱好、所以虚度人生了。其实大家都在找办法kill time而已。

我不是个人开发者,最多算半个,毕竟有一份正式的工作,这个应该是 side project。最近在做一个 blog,实现 Headerless CMS + React 这个概念。

这不是我第一个 side project,但却是我坚持最久,并且实现最完整的一个,而且确实克服了很多困难。

主要原因是用了一个 Github 的 feature:Project,其实就是简版的 Jira。

我每次想到什么好的点子,要修复的 bug,或者想要实现的 feture,都记录下来。然后一个个解决,当把已经解决的问题挪到“Closed”栏的时候,还是很有成就感的。

而且每个问题,有优先级,排个先后顺序。

这样真正可以把项目一点一滴向前推进。

- 阅读剩余部分 -

看新闻,有一个小公司叫做Zingle,可以给公司发短信,比如定酒店、叫客房服务,甚至买咖啡,最近被收购了,4200万美元现金。

挺好玩的,但说明什么,这个idea其实就是多渠道客户服务对接系统,比如你有个twitter账户,有人在twitter上at你们公司,对吧, 订酒店,买咖啡等等。我自己给取了一个英文名称,Multi-Channel Customer Engaging System,也不知道对不对。

那么,既然短信可以,能不能email呢?facebook呢?公司的博客系统呢?Whatsapp ? Facebook Messager? Instagram ? 等等,你们公司在一切社交网络上的账户,能不能用来为客户提供服务呢?

这注定是个脏活累活,但这显然是有钱途的活。

新闻如下:

- 阅读剩余部分 -

其实在上一篇文章里说的开关,有一个更正式的名字:Orthogonality,翻译为中文是正交

这个的细节以后再补充。

首先,编程本身是工程,不是科学。这就意味着条条大路通罗马,没有一个放之四海而皆准的东西。所以说,其实很多人争论的代码风格,哪个语言最好,哪个框架好,这都其实都是哲学问题,因为没有统一标准答案。

代码风格,纯粹是个人喜好,只要能通过编译,这些所谓的风格在编译后都会丢失。简单来说,编译器不在乎。当然,如果你非要抬杠说某种写法性能更好,那就是针对性能做优化。但如果无所谓性能,但着重考虑可读性和可维护性的时候,又是另一种看法了。

语言和框架更是,都是为了解决某个特定类型的问题而开发出来。你写个小博客,用不着C++,用又笨又重又慢的WordPress就挺好,杀鸡用不着牛刀。

尽管如此,在一般情况下,或者某些特定情况下,还是有最佳实践的。比如说,最近发现一个写代码的思路,就感觉很高明,非常高明,据说微软在用,而且也有v站网友提出来,感觉真的非常高明。

这个思维就是开关

也就是说,你新增任何一个feature,都要同时提供一个switch,就是开关,而且必须做好充分的测试,确保你的软件在这个开关的两个状态下都能工作正常。而切换状态就用配置文档,最后的结果就是一套代码 + N 套配置文件的方式,让不同的人按需获得自己的feature

这个高明的思维,首先是看知乎上有个问题,问的是为什么Office软件体积那么大,有人说Office要有开关的,而且做好了充分的测试,所以软件的体积大。当时我就觉得这个思路很牛逼,但是也仅限于感慨而已,因为这个是Office的开发模式,那我这小菜鸟能比吗?后来看到v站上有一个人提问,给一百多个医院写一套软件,但这么多医院,每个医院用不同的模块,而且对每个模块的具体功能的需求也不完全一样,怎么办?最傻的方式当然是复制N份代码,当然这后果肯定是灾难性的,无论是成本角度还是维护角度。然后就有不止一人提出用代码+配置的方式,也就是说,每个feature都是可关闭的。这样就完美解决这个难题。

其实这个思维方式,也应该用在很多其他软件上,比如有一个按理说应该很好的电商程序fecshop。这个fecshop或许真的很不错,但推广受阻,我自己也是勇敢的尝试了一次就再也没用过了。

不是这个电商程序不好,而且这个程序的定位出了问题。在第一次安装的时候,这个程序要装3个数据库,mysqlredismongodb。可怜我当年还不会用wsl,在Windows系统上装这三个数据库简直是不能更痛苦了。勉强跑起来了之后,感觉太强大了,不敢改代码。当然,也可以用docker来装,但到今天我还不会用docker。

所以问题出在哪里呢?定位。
第一,这是一个开源电商程序,必然会有各个层次的程序员来使用。考虑到95%的程序员都是CRUD Boy(我也是),这个电商程序的学习曲线未免太陡了。
第二, 还是定位。假如我就三个商品,比如Github这么大网站,也才3个商品,因为会员就三种,免费的,个人收费版,企业版。用得着这个吗?大量卖服务的小公司,就是5种以下的。
好,假如你是卖小商品的,比如,卖衣服的,就一个有点个性的小店,可能你的商品数量也就是一两百种,撑死三五百种,这样的一个小店,用得着三个数据库吗?
再次,就算用得着这么复杂的一套数据库,一开始用得着考虑性能问题吗?一开始MySQL一把梭,就可以解决问题,包括队列服务,都可以用MySQL。至于其他高级功能,就慢慢上呗,这个时候真的就需要开关这个思维方式了,每加一个新feature,就新增一个配置即可。如果一开始就是奔着大网站去的,注定是门槛太高,曲高和寡。
最后的最后,如果真的是大网站,为什么不用JavaMySQL够用吗?这些问题的答案是显然的。

好,说完了这个开关的思维,再复习一下UNIX哲学,其中一条是Do one thing and do one thing well。这个思维方式是第一个震撼到我的思维方式。