本人铁匠一枚,某年某月的某一天阴差阳错地踏入了程序开发的世界,我没有后悔当初这个决定,相反我还非常感谢我自己做了这个改变自己的选择。
铁匠是个什么职业?这里说明一下,材料热处理专业毕业的学生,毕业之后顺理成章地找到对口的工作,从事和热处理专业关系紧密的工作。这是我对这个专业的定义。
你可能感到好奇,一个处于工业制造领域的铁匠怎么会跨界到计算机软件领域,是工作不顺利还是其他原因?这里先卖一个关子,在讲这个故事之前先聊一聊 程序猿 。
说起编程,有些人的看法就是:
- 用脑强度高
- 邋遢
- 生活无规律
- 起早贪黑
- 黑眼圈外加目光呆滞,永远是处于缺觉状态
- 性格内向不爱说话
- 没有女(男)朋友
- 身材瘦弱
......
剩下的自行脑补
各位程序员请息怒,上面这些都是假象,至少很大一部分是
在互联网领域英雄辈出的年代,其实程序猿是一个光鲜亮丽并且前景无限的职业,绝对的潜力股,我可以举出很多的栗子,哈。很多的大佬都是写程序出生的,例如QQ、Baidu、Facebook、Google...很多的IT巨头企业创始人都曾经是程序员或者参与到编程活动中。
so,编程是很值得学习的一项技能。
认知的蜕变
很长一段时间我都在工作岗位上兢兢业业,从技术员到管理岗位,为了如何达到月薪10万苦苦思索并且为了这个目标努力工作。尽管岗位在不断变化,但是没有创新点,踩着前辈们的足迹按图索骥,以至于在长期单调的工作中将自己的创造力消耗殆尽,每天做着重复的事情,在而立之年还没有达到月薪1万的目标。这是非常令人沮丧的事情,年龄在增长,对新事物的敏感度降低,激情减退,面对中年危机,生活压力逐年增加,心情也好不到哪里去,无奈、迷茫、恐惧随之而来,这是一个恶性循环。
为什么会陷入这种境地?
创新对很多人来说是一件奢侈的事情,为什么奢侈?创新是一种行为,这种行为建立在改变事物现有运作方式的基础上,在大部分领域中,特别是传统行业,创新成本还是很高的,改变并不被积极提倡,现有的盈利模式可以维持企业运作,管理层不愿意去冒险投入太多资源到创新活动里,投入的资源有限,也就意味着也只是极少部分人能参与。没有充足的创新机会,自然个人发展受到限制,空有一腔热血,没处洒。
有没有一种可能跳出这种循环?
我不会做那种说话说一半的事情,我就来说说我的看法。
选择合适的时机主动将自己置身于以创新为驱动力的行业
比如互联网行业就是非常具有代表性的例子。实现方式很简单,跳槽到自己感兴趣的初创公司或者自己创业。合适的时机很重要,并不是今天想到了改行,一拍大腿就决定走人改行,这叫冲动,一不小心就人仰马翻,然后一段时间单曲循环《冲动的惩罚》。
合适的时机要满足三点:
- 我真的喜欢这个领域?我做好了准备大干一场?至少问自己100遍,最后得出答案:我热爱这个领域,我确定我能做到!
- 我凭什么融入到这个行业?没错,问题就是这么简单粗暴,对自己就要狠一点。出国深造至少得会当地语言吧,做顺风车司机总得有辆自己的车吧,做饭至少得有一口锅和食材吧,在简书上写文章至少得有一个简书账号吧(好像有点跑偏了)。客观认知自己的能力是很难的,我一直这么觉得。如果你热爱互联网行业而且是编程高手,却一直在苦逼的做行政管理,那是自己压制自己,日子久了会憋出病;你要投身互联网行业,但是只会在简书写鸡汤,连互联网是啥都不知道,那就是自大。两个例子极端了点,可以说明白道理就行了。改行有风险,没两把刷子,连沟通都会困难,所以还是要谨慎,凑齐两把刷子再改行。
- 知道磨合期不,别把自己饿shi了。
好吧,反正我是打算融入互联网行业了,人生就那么几十年,想做什么就努力去做。
跨界##
2009年我第一次接触编程这个事物,同时被深深触动,通过互联网共享信息非常方便,这让普通人通过一个想法改变世界成为了可能。信息传播成本低、效率高,在英雄不问出处的互联网时代,我找不出什么理由不参与其中,需要做的只是拿到一张入场券。
入场券有很多种,像马云一样不懂技术但是拥有敏锐的互联网思维并且成功开启中国电商新时代的传奇励志模式不是每个人都能企及的,也不可能每个人都能有一个“拿1亿去尝试一下”的富豪老爸,这些入场券对于普通人来说虚无飘渺。
学习编程作为一种入场券,是无限量供应的,幸运的是,起点高低和成就并没有因果关系
我相信大部分人都明白这个道理,为什么喜欢编程的人儿并没有那么多。
- 过程枯燥(让我天天对着电脑撸代码,真无聊)
- 代码密集恐惧症(字母符号密密麻麻的看了想吐)
- 我没有想过要改变世界(真的没想过?)
- 一个Hello World就够了,这么多条条框框,让我写一个程序等于杀了我,还是安静的刷微博吧
额,我想是普遍觉得太难了,面对着各种冷冰冰的字母符号实在打不起精神,一本Think In Java
都比新华字典厚,现在所有汉字还没认全呢。
既然决定跨界编程,必然和程序做了好朋友啦。我是这么理解的:
如果赋予程序代码生命,程序的世界和现实世界中的“管理”就会如此相似,学会怀着一颗感恩的心看待程序,了解学习它,程序自然会配合完成你的需求。
- 我无法让某个人每天24小时站在店门口招呼来往的客人,并细致入微的聆听和反馈,但是HTTP服务器能做到。
- 我无法让某个人毫无怨言地从100万颗稻谷中筛选出长度为6.66毫米的所有稻谷,对于程序一个循环几行代码就能完成。
- 我无法错怪了某个人之后让他继续毫无情绪地为我工作,程序只会友好地报个错,修正了之后该干嘛干嘛。
- 我无法相信会有合伙人在公司发展过程中一点股份都不要,但是作为开路先锋、中坚力量的软件程序是不会要你一丁点股份的。
对不起我调皮了。当你有一个改变世界的想法(是不是又扯远了,好吧,我差点写成了宇宙),正在苦恼该怎么去实现它,现在就打开你的电脑,了解编程,编程可以让想法变成现实。
论刷子是怎样炼成的
咱闯荡江湖的,没两把刷子可不行。刷子是非卖品,装备完全靠打!
这里用一件事来说明。有朋友问我做一个电商系统要掌握什么技能,怎么学习。对这种问题我是排斥的(谁让他是我的朋友呢),这真是一个很宽泛的问题,根据规模大小需要的技术有很大的不同,我想可以从基本的数据库和HTTP服务器开始侃大山,一直侃到搜索引擎、标签的联合索引、redis队列和数据持久化、图片cdn、传输安全问题、事务安全、缓存、负载均衡、分布式数据库...等等,反正点几份快餐,咱促膝长谈24小时,而且99%的可能性会听不下去。
设计一个程序就是做好两件事,一是了解用户行为的流程,二是怎么尽可能让这个流程进行地顺畅和安全。对于电商,核心流程是用户挑选商品->交易付款->生成订单->配送跟踪->确认收货后出账完成交易。把这个业务流程转化为数据的流转,就是程序的具体实现。
- 为了方便管理和统计这个流程的运行情况,衍生出了后台和中台。
- 为了解决高并发导致库存和订单统一的问题,需要解决原子操作的问题。
- 为了提供体验良好的交互界面,需要提高前端的响应速度、美观度,改进内容编排方式。
- 为了提高用户获取信息的效率,需要提高程序响应速度,简化中间环节。
- 当然还有很多需要考虑的因素。
列出这么多的为了,就是为了说明一个观点:
会素描的童鞋都知道,先画轮廓再勾勒细节,无论多么美丽多么色彩丰富的画作都是从几笔单调的轮廓开始的。无论多么复杂的系统,初衷都是极度简单的一件事。
进行系统设计的时候可以简单粗暴地仅仅实现核心流程,简称原型。很快就会发现原型漏洞百出,简直弱爆了,团队小伙伴们开始强化原型吧,这是一个很快乐的过程,也是一个产品茁壮长大的过程。
这个过程是需求主导的开发流程,初始阶段我们完全不需要去纠结一个Button该怎么放置,侧边栏的比例是1:5还是1:6,如果以后数据量上亿了这个数据库字段这样设置是不是不合适了,颜色看着怎么总不对劲,服务器是否能承载大流量,数据库会不会down掉,用原生实现还是用哪个框架实现,Java还是PHP还是Python或者nodejs...
现实生活中我要打车去见朋友,这个时候我不会去纠结出租车是现代还是桑塔纳、轮胎是什么纹路、车牌有多少个8、司机是不是美女,我关心的是如何能在约定时间安全到达目的地与朋友见面。我们无法让产品从诞生就是完美的,所谓的完美只不过是伤仲永的另一个版本而已,事实上没有任何一个产品是完美的。
这幅图看着很搞笑,不过这确实就是很多软件开发的现状。我不会把像新华字典一样的文档一股脑背下来(文档是用来查的,不是背),我不会为超过半年才会发生的未来事件去花太多的心思(变数太大),我不会去争论什么是世界上最好的编程语言(吕布战秦琼,想多了只会浪费粮食)。
非专业人士的非专业观点:不要为了技术本身而学习技术,技术服务于现实需求,脱离了需求技术就没有价值,技术更迭速度是如此快,可以说技术本身就是抽象的,学过编程的童鞋都知道面向对象中的接口,我们不必把抽象的接口强制定义为一个实例,接口的设计思想不就是抽象功能,多种实现么。程序员应该把自己定位成不断实现需求的接口,而不是某一个技术领域的实例,如果真成为了一个实例,就算这个实例非常强大,最终也难逃被淘汰的命运。与实例不同,接口天生具备适应环境的能力。
根据实际需求学习技术远比根据技术现状实现需求要好,至少对于互联网行业是这样的