优秀的开发=扎实的计算机基础+产品化思维

前言

百度多了  你就明白:它也许有用,但它封印了你精进计算机英语的机会。 

Google多了  你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。  

开始读书了  你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。  接触到国外大社的书后,你就明白:国内那些21天宝典,7周速成,都是些什么玩意,误人子弟!  图灵牛逼,动物牛逼,Manning牛逼。  

好书读多了  你就明白:技术是一环扣一环的,有牢固的技术知识体系,学啥都事半功倍。  

书不够看,还可以看论文,经典的如 raft论文,rest论文,算法同学也是不断地在看顶级期刊的最新论文

多做业务  你就明白:所学的技术该用在哪。  

多做用户量大的业务  你就明白:光会用技术,和用好技术是两码子事。  
多找第三方开源  你就明白:原来工作摸鱼不是梦。  

太随便用第三方  你就明白:某天需求一变,它兼顾不到,可以把你往死里坑,坑到你得去看源码。 

第一次看完源码  你就明白:开始还是很讨厌的,等全盘搞明白了,发现“咦~有点意思”。  

源码看多了  你就明白:自己的查克拉莫名的增多了。而且吐槽文档不全的习惯也渐渐少了,一个不服就跑去观摩别人的源码,顺便偷个师。  

再往后,或许你的技术确实突飞猛进了,然而你却只会觉得编程本来就是这个样子的。  

https://www.zhihu.com/question/356351510/answer/913928066?utm_source=com.tencent.wework&utm_medium=social&utm_oi=38551810998272

编程是最重要也是最不重要的事

这是因为“编程是最重要也是最不重要的事”这是因为编程作为把思维变为实现的这个循环的最后一步(然后写好的程序会成为新的思考输入和基础,开始新的一轮迭代开发),它和一个项目一个系统的所有其他方面都息息相关:需求获取,问题抽象,测试,监控,部署,框架运用,系统间集成,灵活性,未来拓展性,易用性,系统健壮性,多版本实验性,高层业务决策等等,这使得编程变得无比重要(所有的一切都需要编程来最终落到实地),也毫不重要(编程被所有其他一切所约束和指导)。能够支撑这些所有上层思考的程序才是“好程序”,能够支撑所有这些思考的程序员,才是好程序员。学好/学会编程这件事是把所有需要思考的东西都弄明白都学好之后的自然结果。而把这些思考留给别人,自己只做思维和程序的翻译器(区分创造者和工具人的关键),根本无法写出好的程序来。这也是DDD(Domain Driven Design) 的精神之一 (关于DDD的精神,参见此文的最后一段, 阿莱克西斯:在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进? )
链接:https://www.zhihu.com/question/356351510/answer/945352381

为什么CTO不用写代码,他们的核心竞争力是什么?

https://time.geekbang.org/column/article/92540

优秀的开发=扎实的计算机基础(How)+产品化思维(What)

扎实的计算机基础=计算机原理+网络原理+数据结构+算法(包括机器学习深度学习)

产品化思维
什么是产品? 只有投放系统或者微信app是产品吗?

spring、mysql、redis、hadoop、spark、tidb、zookeeper(raft)、设计模式都是产品,只不过他们的用户是程序员。
甚至java本身就是产品。
满足需求的都是产品。

对于程序员来说,我们的每个方法,每个接口都是产品

算法面试题在考我们什么?

面试题1:字符串转换成数字
Integer.parseInt(str)

面试题2:1亿个数字找Top5
hadoop clickhouse

如果第一个数字是英文怎么办,如果中间不是数字怎么办。如果结果大于int.max怎么办

算法和产品是隔离不开来的,有好的技巧工具,也得有好的产品化思维,去确定这个产品会遇到的各种场景、边界然后去合理地组合安排它们。
我们说的各种设计模式,不是出于计算机性能的考虑,而是我们的产品决定了用哪种设计更合理

产品化思维的利器1:抽象思维

抽象是什么意思。总结和提取客观规律,发现共同特征。
消灭重复代码就是在做抽象。
DRY原则、KISS原则本质就是抽象。
高内聚低耦合的前提也是抽象能力。
从3个以上重复代码开始。
例子:订单和支付单,要在合适的阶段做合适的抽象。
Spring抽象了什么,Mysql抽象了什么,TIDB抽象了什么。

差的抽象思维会导致什么? 边界模糊,各个领域互相渗透交叉,系统变的臃肿难于追踪重构
MVC结构的代码,service代码全都在controller

好的抽象会带来什么?
高深莫测的机器学习真有那么难吗?未来的机器学习可能只是个封装好的接口,输入数据得到预测数据(函数式编程?) 深度学习的本质是什么,万能函数,有了算力的抽象和模型的抽象

产品化思维的利器2:全局思维(需要结构化思维辅助)和可预见性设计

设计了效果广告就够了吗,将来需要品牌广告怎么办?
光设计了投放和计费就够了吗? 还有展点销,还有用户负反馈还有app唤起这些一条链路上要关系的过程和数据。
你需要结构化思维把影响到的各个环节都列出来,定义好主次、定义好顺序、定义好边界,才能确定你自己产品的最终形态。
差的产品的眼界也会狭隘,只会满足一时、部分用户的需求。但是开发缺乏了预见性就会被带坑里,背锅的还是开发。

产品化思维的利器3:数据思维

一个产品是用来做什么,是为了满足用户的需求,但实际上我们想要什么,可能自己都无法确定,太主观的描述,无法定量,而且个人也不能代表群体。
数据是后端的下游,好的产品开发,会站在用户分析的角度,去设计合理地产生数据的逻辑。
ABtest,MVP(最小可行产品)、敏捷开发用数据驱动产品。

产品化的最高级形式:服务化、DDD(领域驱动设计)
DDD的一些概念:
领域:领域相对于软件系统来说,就是系统要解决的现实问题,一个领域对应一个问题空间,是一个特定范围边界内的业务需求的总和。领域来自于需求,但它却高于需求,相对于善变的需求而言,领域知识和领域模型本身是“静止”的,是“不变”的
通用语言(其实就是产品化思维,设计语言要跟业务语言一致)
分层:
限界上下文:“限”的意思就是划分、规定,“界”就是界限、或者一个边界,上下文就是业务的整个流程,总的来说,可以称限界上下文为业务流程在一个划定的界限中;限界上下文,是一个显示的边界,领域模型存在于这个边界内。在边界内,通用语言中的所有术语和词组都有特定的含义,而模型需要准确地反应通用语言
实体和值对象:面向对象和函数式编程的区别?

阿里中台实践

学习方法

知乎(关注大牛和相关话题)、掘金、头条(科技卡片)、跟优秀的人学习、公众号
获取书单还是挺重要,看书是系统性学习

未来的方向:

云原生,FaaS,业务架构师

Refs

你可能感兴趣的:(优秀的开发=扎实的计算机基础+产品化思维)