普通码农和CTO之间的差距
虚心
学习的第一步是——“我不懂”。一个空是水杯才能装水,如果是满的就没有办法装水了。“自我肯定”是一种非常难克服的习惯,经常会有朋友看到某个技术或者实现之后不假思索的是——“好烂”;如果问他烂在哪里几乎说不出个所以然来。
最近微软发布了。NetCore,如果你有机会看到这个标题的文章不妨看一下评论。各种“喷子”从“性能”、“道德”、“微软很坏”、“PHP是最好的”等各种无厘头开喷。这似乎是程序员们的通病,对于一个自己没有好感的东西(比如:国产或者微软,这两个最容易拉仇恨)会各种毫无理性的嘲讽。这种狭隘的胸襟往往会影响自己成长。
不要待在舒适区
心理舒适区,是指人们习惯的一些心理模式,是你感到熟悉、驾轻就熟时的心理状态。人在这个“区域”是非常“舒适”的一切驾轻就熟,工作轻轻松松;一旦走出这个“区域”就会感到不安全、焦虑,甚至恐惧。
一些人拥有“5年工作经验”甚至“8年工作经验”,仔细聊下来你会发现他们可能是“一年工作经验用八年”。他们用的工具是一万年的Eclipse(甚至不愿意接受新版本的Eclipse);他们的编码风格非常具有浓郁的“历史感”;他们习惯用一些“自己”(或者公司的)一些“框架”来做开发。这就是很长时间待在“舒适区”的结果。失去对新技术的追求和探索,一味的否定或者找各种不靠谱的借口开脱会让自己的只是越来越陈旧,目光越来越狭隘直到有一天突然发现——舒适区已经没了,才真正的陷入恐慌。
勇敢的走出“舒适区”去探索新的技术,新的方法;把“非舒适区”转换成舒适区会拓展我们的知识面。这种不断探索的精神最后可能发展到——不仅仅停留在探索“IT技术”上,开始各种折腾,比如折腾电子制作、折腾写小说、折腾研究曲艺、折腾评书(好吧,后面两项是我的爱好)。
经常思考
“写程序的康德”,这个公众号的寓意就是思考,我的出发点是发一些东西可以让大家多思考(希望我达到这个目的了)。
解决完一个问题后我们要经常“回头看看”,我们要学习的不是“解决具体问题的办法”而不是“解决问题的方法”。很多朋友通过网络或者同事帮助解决完一个问题之后就没有然后了,不会去主动分析问题的原因,解决办法、原理。这样的“经验”不能算经验,最多算“经历”,没有究根问底的对一个问题进行分析,思考,不能算“解决问题”。
多读代码
最好的学习方式是“山寨”。程序员和程序员之间交流最直接的方式不是UML,不是XXX文档,而是——代码,无论是架构、设计、技巧、规范都蕴含在代码中。
OpenSource运动给世界的开发人员提供了一个巨大的仓库,里面有各种各样的项目,质量参差不齐。通过阅读优秀的代码可以提高你的见识、分析能力。这里推荐几份靠谱的代码:
Java并发包,混并发界你要是没听过DougLea那你算白混了,老爷子说得上是学术、工程两届通吃。文有提笔能写论文,武能键盘码程序的全才。java.util.concurrent依旧经典,无论是API还是性能都叱咤风云多年屹立不倒。(只要你用线程、锁这种并发模型,java的并发库分分钟秒杀所有)
Guava,比起apachecommons包它非常现代化。google的招牌这个就不必多说了。
apacheroller,如果你需要一个JavaEE的正确姿势,那么我推荐这个,除了有些显老之外没有别的缺点。Apache的招牌也是非常硬的。
做业余项目
做一个业余项目可以给我们更大的自由,在这个项目中我们可以尝试新技术,新方法,完全有自己决定所有的技术。如果一不小心,你的项目对很多人带来帮助那会给你带来更多的机会。
做一个业余项目是非常锻炼个人能力的事情,当我们在吐槽xxx技术不行的时候不妨自己在业余项目中尝试一下,或许你会理解作者的难处;当我们觉得xxx技术简直是非常酷的时候不妨自己在业余项目中尝试一下,或许你会发现它除了能写一个helloworld之外真的没有办法干别的事情了。
和别人交流
自己学会一个技术是一回事,帮助别人学会是另一回事。在工作中帮助同事解决问题往往可以给我们带来更大的收获(也会收获更大的成就感)。
和别人交流技术可以帮助我们提高两方面的能力:
提高技术理解的深度,如果我们想把一个技术讲个别人听首先要自己把它的每个知识点搞清楚。比如我们可能对HTTP协议并不陌生,但是真的要讲给别人听怎么讲?HTTP协议和TCP协议什么关系?HTTP协议有那些支持的方法?什么是无状态?为什么设计成无状态?Session和Cookie是什么关系、什么样的工作原理?看似很简单的问题,其实蕴含着很多知识点,通过“交流”我们会对曾经认为——“我会了”的技术有更加深刻的理解。
提高表达能力,表达能力不是一朝一夕练出来的,也没有固定的技巧可循,它完全是一项“实践性”技能。通过交流我们可以不断的磨练自己的沟通技巧,如果我们能把一个技术讲清楚那么我们的沟通能力应该足够我们搞定“萌妹子”的。^_^
学习技术而不是工具
在新框架,新方法,新工具横行的今天我们很难判断出哪些是“技术”,哪些是“工具”。我个人认为程序员不存在——Java程序员、Python程序员、Android程序员、iOS程序员,这些前缀都是“工具”,后面的“程序员”三个字才是技术。让一个人号称做Web的去做Android为此离职的人真的不在少说,他们的理由通常是:我是做JavaWeb的,不是做Android的。但是如果有一天Web没了怎么办?甚至有一天Java没了怎么办?(不是危言耸听,Java最近的负面新闻太多。以Oracle的无耻性格放弃它也是干得出的,不要以为名气大就不会被干掉,被干掉OpenSolaris、OpenOffice、Mysql个个历史悠久,名气大。)
那么究竟什么是“技术”?答案:数据结构、操作系统、计算机体系结构、数据库原理、编译器工作原理、软件工程方法论等。我们的所有的工作都是这些理论的实践,通过这些实践我们发现问题通过刨根问底的方式回到“理论”,这样一套追踪下来保证大家醍醐灌顶,豁然开朗,欲仙欲死,爽到爆。
举个例子,Spring都不陌生。但是它是什么?会有人用AOP、IoC来回答,那么继续追问AOP和IoC是什么?会有人举出一些例子来说明AOP和IoC。但是这些都不是答案,Spring是容器,不信可以去看官方文档开头写的
TheSpringFrameworkisaJavaplatformthatprovidescomprehensiveinfrastructuresupportfordevelopingJavaapplications.
Spring是一套Java平台的基础架构,继续翻跳过AOP和IoC之后迎来第一个模块“2.2.1”叫CoreContainer(包括spring-core、spring-beans、spring-context、spring-context-support模块);第三部分的第一个章节(7章)叫TheIoCcontainer。所有IoCContainer是任何一个spring模块都必须依赖的基础技术,它是整个Spring的创新点和关键所在。如果你继续探索(可能需要很长一段时间),你会发现什么是组件,什么是容器,什么是生命周期管理,在这个过程中会不断的加深你对Spring的理解,也会升华你对组件开发的理解,对软件设计的理解。(在这个xxxinAction,xxx技术内幕,xxx深入浅出的时代,我要推荐一本老书《ExpertOne-on-OneJ2EEDevelopmentwithoutEJB》,作者RodJohnson,没错Spring的缔造者。有选择的看一些章节,通过“考古”你可能会发现Spring设计的动机究竟是什么。该书已经绝版,请自行搜索电子版)
我的一个经历
我刚入职的时候公司所有的Service都返回一个这样的类:
err表示是否出错,代码里面还定义了一堆的错误代码;data表示实际执行的结果。所以每次调用都要执行一个if判断,如果错误代码不存在还需要自己新增一个。虽然我的项目经理告诉我这个方法就是“标准”,但是我觉得这个写法太low了。所以等到我能自己决定怎么写的时候,我写下了下面的代码:
我的实践告诉我,没有正常人喜欢用“错误代码”,世界上不可能还有比这更恶心;也没有一个正常人喜欢强制类型转换。所以新的Result里面用isSuccess表示是否执行成功,如果失败则错误消息通过errorMessage返回;用泛型解决了Object强制转换的问题,。
当然,后来我用了异常。因为我觉得没有正常人喜欢用if来不停的判断,看起来就像C语言一样“二”。函数的执行结果并不是很明显,每次都要get一下才能拿到结果。所以我用异常来处理错误,如果出错则抛出“RuntimeException”;函数的执行结果通过函数的返回值返回。
这些变化不是一天、两天内产生的,也不是一两年内产生的。随着自己知识的积累,技术的演进我们总是会发现“新方法”,需要我们不断的“否定”->“尝试”->“否定”->“尝试”。
普通码农和CTO之间的差距的更多相关文章
- 码农-->工程师
微信公众号推送文章记录,侵删 一个猎人的比喻: 当土著拿到猎枪之后,他们射箭的技能退化严重,但因为食物更多了,厨艺有了长足的进展. 当你不再为一些问题担心之后,你就可以把注意力集中在另外一些问题上了. ...
- 管理与技术未必不可兼得,一个20年IT老兵的码农生涯
作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...
- <开心一笑> 码农 黑客和2B程序员之间的区别
笔记本电脑 码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L< ...
- 码农、黑客和2B程序员之间的区别
码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L<<32 ...
- WPF开发中Designer和码农之间的合作
想要用WPF做出一流的软件界面, 必须要Designer和码农通力合作.理想的情况是平时并行开发,Designer用Expression套件(包括Design和Blend)来设计界面,码农开发Mode ...
- 【整理】待毕业.Net码农就业求职储备
声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除了技术 ...
- PHP码农在Golang压力下的生存之道-PHP性能优化实践
随着国内Golang的火爆,phper的生存压力越来越大,在一次内部技术讨论中,gopher甚至提出,要什么php,写php的全部开掉,唉,码农何苦为难码农. 本文试图寻找一种有效实践,减少php w ...
- 关于期权池Option Pools与Vesting:码农创业防身必备法器
之前又看到饿了么创始人团队纠纷的几篇文章,参考了百科.wiki.36Kr.虎嗅.知乎以及邵亦波老师的文章,对之前一直感兴趣的期权汇编初略总结了下 ,仍觉粗糙,对一些具体操作还是不甚了了,不过感觉在中国 ...
- 码农,就要做有范儿的geek【网摘】
摘要: “我是个geek,圈子里都称呼我为xx,我周一到周五亲自写写代码,指导指导新人,周末参加圈子的活动,跟别人分享一下我的经验.至于未来嘛,还没想过,反正自己技术水平在这了,呵呵,扎克伯格当年不也 ...
随机推荐
- [luogu4259 SCOI2003] 严格N元树 (高精 计数dp)
题目描述 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d(根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严格2元树有三个, ...
- Uboot优美代码赏析1:目录结构和malkefile分析
Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...
- 2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地
import requests import time base_url='http://www.bobbns.com/common-web/cms/content!getContentsInclud ...
- php 中引入邮箱服务 , 利用第三方的smtp邮件服务
项目中用短信通知有时间限制,对一些频率比较大的信息力不从心. 使用邮箱发送信息是个不错的选择\(^o^)/! 首先要注册一个邮箱,在邮箱设置里开通smtp功能. 简单介绍下smtp,大概就是第三方客户 ...
- 洛谷 P3576 [POI2014]MRO-Ant colony
P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...
- Android实现天气预报温度/气温折线趋势图
Android实现天气预报温度/气温折线趋势图 天气预报的APP应用中,难免会遇到绘制天气温度/气温,等关于数据趋势的折线或者曲线图,这类关于气温/温度的折线图,通常会有两条线.一条是高温线,一 ...
- 《UNIX环境高级编程》读书笔记之系统数据文件和信息(1)
1.UNIX系统口令文件包括了下图所看到的的各字段,这些字段包括在<pwd.h>中定义的passwd结构体中 POSIX定义了两个获取口令文件项的函数. 在给出用户登录名或用户ID后.这两 ...
- 区间不相交&区间覆盖
//code by virtualtan 2018 寒7 区间不相交 #include <cstdio> #include <algorithm> #define MAXN 1 ...
- HD-ACM算法专攻系列(11)——Exponentiation
问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...
- HD-ACM算法专攻系列(6)——Big Number
题目描述: 源码: #include"iostream" #include"cmath" using namespace std; #define PI 3.1 ...