Showing posts with label Career. Show all posts
Showing posts with label Career. Show all posts

Tuesday, March 8, 2016

How to thrive to thrive: software engineers



https://www.androidperformance.com/2018/10/25/How-do-engineers-count-well/
  1. “我们一定要有一个坚定不移的深刻的理念,相信整个世界终究是为技术所驱动的。”
  2. “有没有其他人已经解决这个问题?然后你可以把你的时间放在更好的创新上。”
  3. “做什么事情一定要做最好,一定要是做业界最强的。”
  4. “我把自己想象是一个软件、一个代码,今天的版本一定要比昨天版本好,明天的版本肯定会比今天好。”
  5. “看到问题也不要去问别人,就把它 Fix。”
我现在的要求是,每一次你写一行新的代码,第一要做的,先想一想你这行代码值得不值得写,是不是有人已经做了同样的工作,可能做得比你还好一点。有没有其他人已经解决这个问题,然后你可以把你的时间放在更好的创新上。
特别是大公司里面重复或者是几乎重复的Code实在太多,浪费太多的资源,对每个人的职业生涯都不是好事情。
我再强调,在大公司内部,你写代码之前想一想,你这行代码要不要写,是不是别人已经有了,站在别人的肩膀上去做这件事情。

我另外还要在这里强调的一点就是 Relentless pursuit of excellence:永无止境的不断的持续的追求。
我们要么不做,要做的事情一定做最好,这是我对大家的要求。数据库也好,做大平台也好,大数据也好,我们要做什么事情,我们一定要下决心,这是我对你们每个人的要求,做什么事情一定要做最好,一定要是做业界最强的。

英语,另外有一句说法就是Life is too short, don’t live the same day twice. 同样一天不要重活两次。每天都是不一样,每天为什么不一样,因为每天都变成最好,每天都变得更好。今天的版本一定要比昨天好,每个好的、杰出的工程师,杰出的技术领袖,一定要保持自己学习的能力,特别是学习的范围。


https://www.quora.com/Is-staying-an-individual-contributor-software-engineer-your-whole-life-a-good-career-choice
As a rough model, your career success and growth is proportional to the value you create.
Technical Ability + Experience ≠ Impact
Engineers with over 10 years of experience at places like Google will often wonder why they’re still only a senior software engineer on the career ladder. What happened to the promotions that seemed to have come readily in their earlier years? Why are some of their peers getting promoted above them?
One of the biggest career mistakes that engineers — particularly those who opt out of management — make is to equate technical ability plus experience with increased impact. They hold onto a belief that if they continue to do good work, they’ll eventually be rewarded with a promotion. That mental model is flawed for two reasons.
First, your technical ability to write code and build software plateaus over time. When you first start out, you're frequently making technical mistakes. Every small project becomes a learning opportunity that hones your programming skills. As time goes on, you become more proficient at coding and software design and make fewer mistakes. Your early promotions up the initial rungs of the career ladder reflect your early technical learning. By year 10, you’ll still learn — and you might still be picking up new programming frameworks and languages — but your progress and improvement isn’t going to be as dramatic as it was in year 1.
Second, experience doesn’t directly translate into impact. If ten or twenty years from now, you're still solving the same scale and scope of problems as you’re tackling today, then you haven’t increased your ability to create impact. And if you’re not creating more value, why would any employer pay you more than someone without that experience? This observation is independent of industry or profession.
It can be easy, comfortable, and even fun to keep doing what you’ve been doing — and it can be a reasonable lifestyle decision if you’d rather spend your energy elsewhere on life outside of work — but you shouldn’t then also expect your career to grow on its own. What matters isn’t the number of years of experience but how much value you create. To keep growing your career, you have to keep finding new ways to increase your impact.
Management Is Just One Leverage Point to Increase Your Impact
One corollary is that if you work on a team or a company that isn’t growing, it will be more difficult for you to grow your own career because the value that you can create is limited. If you’re working on a dying product that loses the company money, how much value could you possibly be adding? This is why Sheryl Sandberg argues in Lean In why it’s so important to hop onto rocket ships when evaluating job offers.

http://www.1point3acres.com/bbs/thread-167098-1-1.html
地里同学很多也不再是new grad,从最初的有份工作就好,很快会转而考虑如何最大化自己的成长,钱途,和谋求更多发展。

除了写代码,还有什么可以做的?
如何开会,如何组织会议,如何给talk,如何好好故事,如何说服别人,达到你的目的?
在工作岗位也会涉及要求升职,换组,跳槽,negotiate salary
在公司遇到不靠谱的老板,不靠谱的同事,如何抗争不公正待遇?
什么是PIP?有什么先兆?PIP了怎么办?- Performance Improvement Plans

在大公司做几年也会考虑进(early stage)startup
或者业余做自己的项目
或者干脆开自己的startup

negotiate offer: never tell them what your current salary is. NEVER

短暂工作经历,(<3m) 
简历上可以不写,免得麻烦 (刚在其他版看见的
Teamwork: 永远不要偷偷做好事,有贡献,帮助别人的时候必须大张旗鼓给老板和所有人看见。
如果你写帮助文档,里面的例子code, 截屏别忘记全用自己的账号或者机器名,让以后看见的人怎么都忘不掉这是你写的。

自我表扬和表扬别人当然需要大张旗鼓,发email什么的到处让人看见
公开谈功劳,别忘记摆摆姿态,说we accomplished blah...口头给别人功劳和赞誉,不要吝啬。
私下绝对别忘记改口说 I did blah.... 别说虚伪,你不这么干你就被别人阴。

有技术绝活是否教给别人:酌情考虑。一般来说,私下的,绝对不教;公开的,能到处给talk的,教。Teaching类技术文档如果可见度高的,写;否则不写。

如果是同一战壕的,其实是可以的,需要酌情考虑 ---- 其实我也遇到很多真心教我的人,我也真心教过很多人。如果找好了搭档,其实完全可以win-win-win

国人的谦虚 -- 看着办:
如果fresh小硕对着年长国人tech lead说自己精通blahblah,你可以想象,效果不会好。
但是对白人老板,绝对要说自己精通,所有东西一学就会,您让我上吧,绝对能胜任。
对所有人,永远不要说不会。不会,你不会去学吗?

当好人:
不要随便答应某件事可以做(i.e有空做),然后做不出来又拖延,尤其是上级分来的任务。
如果本来就很忙,还有人堆一堆事情给你,可以态度很好的直接说:好的,我可以帮忙,那我手头哪些其他事可以先暂缓的?

不同意见:
意见不同的,看见email也不要respond,切忌头脑一热就点发送键。不好的话,宁可当面说,才容易控制局面。
根本不回复,就当没看见,也是一种非常valid的response

有你觉得不正当的事情,先想好你指望你老板如何处理,再考虑去提--- 如果没有解法就别抱怨

如果你是员工,尽量态度坚定温和,不用有什么脾气,it's only a job, it's not personal. from: 1point3acres.com/bbs 
如果你是老板,请偶尔慎重的经过考虑的发脾气,
如果看见你老板发脾气,he's putting on a show, it's not really an outburst. Waral 鍗氬鏈夋洿澶氭枃绔�,
. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
党同伐异:
拉拢战友,但是别轻信谁,你同事不见得是你的挚友,别期望太多。不抢你功劳的已经是本分,如果能相互promote的那就是职场非常难得的了,值得好好培养关系。
无论在任何地方工作,看看周围,有没有牛人,有谁是将来你离职创业,想去求合作的人?(一般是人品技术都赞的),如果有,请搞好关系。
形象建设(make yourself visible)
每周汇报:每天记录accomplishments, 每周五编辑好,发个report给老板
---- 这个practice 一般是team lead做的,但是哪怕你不lead任何人,也可以是你自己的lead
而且review的时候你就会很容易找出来哪些行为high impact
给talk:如果有area of expertise,那最好了. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
如果没有,仍然可以Host brown bag (lunch and learn),跟大家分享自己学习经验即可。

开会的时候多说话:有话说那最好了。.1point3acres缃�
如果实在没有什么好说的,可以表示赞同,老美很善于这么搞,老中偏向于沉默的坐在一边,这是不可以的!!!.鏈枃鍘熷垱鑷�1point3acres璁哄潧

必须经常跟老板1-1,不然老板容易忘记你的存在。

what to say when you leave a job?
you dont have to tell them where you are going to. 1point3acres.com/bbs
you definitely don't want to bitch and whine and tell them why you are leaving (which almost always reflects badly on your boss) 鏉ユ簮涓€浜�.涓夊垎鍦拌鍧�. 
don't burn bridges
always say: it's not you, it's me - -- a vague reason like "it's time to move on" is perfectly fine
. Waral 鍗氬鏈夋洿澶氭枃绔�,
Find something good to say about your old place, and say this like you mean it 
after all, no matter what, any place would have some shiny points that are worth bragging about. 

if you think you might be of value to your ex-employer, make it known too -- it is even possible that they value you so much, that you get hired back as consultant and earn much higher rate. 
Counter offer: accept or not?
99% of the case: no. 

only very very rare cases would a counteroffer work out -- i have seen them.
可以毁约吗?. From 1point 3acres bbs答案是:可以:

你的人生你做主,雇主可以rescind offer 你也可以毁约不去
quote quora: 
As a general rule, be professional, but don't feel sorry for companies.
Your employer is a big part of your world while you are there, but you are just one employee to them.

如何要求涨工资?
无论你老板懂不懂具体技术细节:技术高级不重要,instead, sell你的贡献
比如你的某项目给公司赚了或者省了多少多少钱
这么做的关键是:不要管这些钱是不是真的
比如是ABCD组合作的结果,你要说:是“我”工作的结果。. 鍥磋鎴戜滑@1point 3 acres
比如你其实省了x, 另外有一个奇怪bug让数据看起来省了y,只要y > x,你就说y
玩命往大了吹,千万不要谦虚,拐弯抹角能牵扯半分钱关系的,就都扯上
你全讲真话或者全吹牛,老板心里都只是大致给discount一下而已。不吹牛你就亏大了。
比如:我去年给公司赚了x 米粒,您给我涨个y万吧

花时间promote自己.1point3acres缃�
假定你写代码之前要写design doc. Waral 鍗氬鏈夋洿澶氭枃绔�,
那么你ship之后就需要写自吹自擂的东西,做各种记录和宣传。
it is not optional 没有用吹牛来结尾的项目,等于你没做。
宣传完了这个功劳也未必是你的,但是假定你不去到处宣传,你这个项目就等于完全没做。. From 1point 3acres bbs

如果在这个公司还有上升空间,你还打算待一阵子,那么花在self promotion上的时间,精力和思考,应该大于所有其他加起来。

具体宣传方式取决于公司习惯
有的地方,你要写slides到处去讲---记住,真正黄金白银的技术细节必须语焉不详,
别人看了也no f***ing way能复制。但是吹牛的部分,请用尽你的全部方法,
让它看起来牛逼,影响巨大,给公司和你老板带来了多大多大好处。哪怕你心里有半点的退缩,你就已经输了。

有的地方你需要发论文. 1point3acres.com/bbs
. 1point 3acres 璁哄潧
有的地方需要写white paper (记住语焉不详)

有的地方写blog post.1point3acres缃�

有的地方可以开讲座

重要的事情说三遍:
没有用吹牛来结尾的项目,等于你没做。

什么时候谦虚?
如果对方有什么技术,你希望他教给你的时候:
很谦虚的表示:您是大牛,您太厉害了,马屁拍的足足的,我是微不足道的小蚂蚁一枚,请您不吝赐教

哪怕对方油盐不进,不教,至少也会笑纳掉马屁。. 1point 3acres 璁哄潧
万一教了,你就赚到了。

当然,谦虚的时候要私下,别让别人听见。
工作不满意,但是跟同事关系非常好,都是好朋友,要辞职换工作吗?

换份工作就不是朋友的人,本来就不是你朋友

你在这里怎么交朋友,在新工作也一样可以交新朋友
手里几个offer怎么选?
earning vs. learning. 涓€浜�-涓夊垎-鍦帮紝鐙鍙戝竷
看你更看重什么
一般来说年轻时候偏向learning
年纪大了偏向earning,当然不绝对. 1point3acres.com/bbs

学习,也未必是要学技术,可以是更大范围的。看你在意什么了。

一份完全没有learning的工作,一般是做不长的--要么时间久了你受不了仍然会跳走,要么你成了被温水煮熟的青蛙
例外是:你可以有很多业余时间,自学感兴趣的东西。

不好的环境典型:
1 老板因为要显得自己重要和牛逼,什么信息都不给你,到处抢你功劳
2 政治家:表面是大家的朋友,背地极其善于抢人功劳,别乱讲他们的坏话,因为你不知道谁就是他的心腹
3 大环境不是engineering focused,比如有很多匪夷所思的规矩,软硬件条件差,人手不够,deadline不合理 -- 这种在FG等公司比较不常见,在其他非软件公司,尤其传统企业多见。

对策:
1 选好胜算较大的目标,做了求原谅,而不是求允许。不过为了稳妥,可以找信任的人评估一下你要做的是否靠谱。pick your battles wisely
2 另辟蹊径:比如可以让一些“朋友”帮你去游说你的项目,或者干脆让别人take 你的credit,好像点子是他们想出来的一样,只要你还是最终能做这个项目. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴
3 manage up: 前文说过的,花时间sell自己。花精力launch products,并让人知道,manage tech debt之类的事情千万别做太多
4 有时候给别人帮点小忙做点感情投资,将来你需要帮忙的时候才有资本。离职的时候绝对不要burn bridges,很多人际资本离职了也可以继续有用
5 哪怕一切顺利,你决定在一个舒服的岗位好好待一阵子:别!万一方向改变,你的组被并入其他地方等,可能你的有利局势就突然变得不利了。
真正舒服的位置,当然越往上越舒服。
6 抱大腿 (英文是seek powerful friends,不得不佩服,还是中文言简意赅)connectors, old-timers,小秘
7 如何找老板要东西:言简意赅:3个bullet point,一个 call to action,三条理由,一个具体的行动

1. try to be the boss's friend - i know it sounds low, and damnit, i hate doing this from multiple levels, but you gotta. 
is he a foodie? artist? gamer? as long as it is not sth you detest, do it. talk to him about it. 

2. schedule 1-1s with teammates, do the same

3. schedule 1-1s with people in neighbor teams (if you are eng, get to good terms with PM/design/ds). 1point3acres.com/bbs

4. schedule 1-1s with similar teams (if you are eng in team A, get to know eng in team B, C, D...)
. visit 1point3acres.com for more.
5. connect with people you know from your previous life (grad school, another job etc), meet every once in a while. if meeting cost is low (i.e. people are nearby), meet every 2 months to catchup is a reasonable frequency. 

6. if you get a chance to connect with someone higher up, cancel other stuff and go.

7. never eat alone, and take notes - again, i know......but, do it

8. share stuff like books, blog posts, tips etc - useful or not, people still appreciate the effort. Don't spam them though (like what recruiters do on linkedin). i.e. keep signal-to-noise ratio high

9. never bad mouth/complain.鐣欏璁哄潧-涓€浜�-涓夊垎鍦�

dont' expect to keep your head down and just code --- that's not how rain is made or how businesses are done. 

i don't care how many hrs of code you write and how tired you may get - if you are not spending x hrs building visibility/connections, you are doing it wrong. Manage image/perception/expectation, it's just as important as, if not more important than your code base.

让老板开心:
如果你跟老板对技术问题有不同意见怎么办?.1point3acres缃�你必须揣摩老板的心理,除非你对自己的某些能力特别有把握,default position必须是:您说的对,就按您说的办,您考虑的比我周全多了,学习到了!

如果老板真的说错了怎么办?
除非你有相当的把握,按你自己的想法能成功,否则按老板说的来,get things in writing,起码到时候捅娄子不会throw you under the bus
如果你按自己说的来成功了怎么办?能跟老板说:i told you so吗? ---- 绝对应该是说:老板你开始就是这么让我做的,您说的对!我照着您说的来,所以这个做对了,你看效果是多么多么好的,感谢您的栽培


level up checklist: 
https://www.quora.com/Is-staying ... -good-career-choice
edmond Lau的那篇非常不错
关键字:impact, 我个人理解是,选正确的方向去使劲,事半功倍

1- You build tools and abstractions that multiply the output of the engineering teams around you.
For example, Jeff Dean, through his contributions to Protocol Buffers, MapReduce, BigTable, Spanner,
and other systems infrastructure, has increased the output of other engineers
at Google by over an order of magnitude. It’s no wonder why Google created the engineering level of Senior Google Fellow essentially for him.
写工具,做抽象,让别人用你的工具大大提高工作效率.鏈枃鍘熷垱鑷�1point3acres璁哄潧

2- You develop sufficient expertise to consult on software or experiment designs from other engineering teams,
and your feedback is valuable enough that it shaves days or weeks worth of work or it turns key projects from failures into successes.
咨询:你的专业经验和建议能给别人帮忙,让别人做事效率更高

3- You become an expert on a deep, technical field that is material to a growing company. For example,
you become a machine learning expert and then work on news feed ranking at Facebook, ads ranking at Google,
or search ranking at Airbnb. The projects you ship directly translate into growth and revenue for the company.. 鍥磋鎴戜滑@1point 3 acres
在某专业领域成为专家,这个领域能让公司级数增长,文中例子是机器学习

4- You identify a critical business opportunity, perhaps by working with the sales and business teams,
and you become part of the founding team within the company to build out a product to address that need.. 鐣欏鐢宠璁哄潧-涓€浜╀笁鍒嗗湴
找出商业需求,跟销售或者商业部门合作,自己开team做出产品来满足需求

5- You build out onboarding and mentoring programs to teach and train other engineers,
and you make them significantly more valuable members of the team.
帮助训练新人,比如做培训项目等,让新人能快速上手

6- You play a key role in building out a solid hiring process, and you help recruit and close engineering hires.
让招人过程更快速可靠

7- You make significant contributions to building the engineering brand for your company.
For example, if diversity is a strong part of your engineering brand, you may move forward the state of diversity in hiring in the industry.
建立公司eng口碑,这个看公司,文中例子是diversity,可能特别适合女的或者其他族裔去搞。小公司的话,多去给talk发paper写blog post 就比较显眼。 . 1point3acres.com/bbs

总结就是:光自己写代码快还不够,要产生重大影响,重要途径:
1. 不光自己快、好,要让别人也快、好(文中的1,2,5,6)
2. 做正确的事情(3,4)
3. 帮助建立品牌,形象(7)

make as many friends as possible
both verbal and nonverbal communication skills
我的弱点:喜好都写在脸上。对策:pavlok 提醒给poker face
如果给老板提的建议不被采纳,你需要把建议描绘成这其实是老板的点子,和他点子的延伸。让他拿这个credit,你可以成为老板的心腹,左右手。 鏉ユ簮涓€浜�.涓夊垎鍦拌鍧�. 
保证交流畅通:让对方复述和确认双方同意的事情。
知己知彼:熟悉彼此的长处和弱点,注意交互过程当中的效果。大家经常容易只关注对方的问题,而忽略自身的问题。
压力的对策:meditate, exercise, slow down. 
office politics 是无法避免的。repeat: 是无法避免的,不要指望靠换工作来解决问题。
熟悉环境:在公司的每个层次都广交朋友,不要流于空泛,别人当然也会找你帮忙,所以,做好准备帮忙。
入职马上搞清楚org chart,心里也画好Power chart,搞清楚每个层次打算认识谁。
keep your friends close and enemies closer (虽然很难,但是看我前老板的的确确是这么干的,天天跟他死敌坐一起,经常一起吃饭)
观察敌人的做事方式,敌人目前的,掌握对方的动向
tunnel vision: 只看见自己想看见的事情 - let go of your personal interest and see the bigger picture -- 这是我的很大弱点,
着眼公司大局,figure out where "I" fit in. 对自己有利,对公司不利的决策很容易被阻挠。-- 我的弱点是相反,我太喜欢“大局”考虑。
以后需要从win-win里面找出让自己win更多的解法。
有人会拿着自己的工作来问你意见:他们不是真的觉得你牛逼,是打算占你便宜,让你白做事他们偷取成果。
绝对不用私下告诉任何人任何事情。在上家公司我总是被这种情况玩的死死的。纠结原因,越是觉得自己有牛逼之处不被重用,
越是容易犯这个错误。正确办法是多做公开的信息传播,比如讲课,give talks, brownbags, write wikis, readmes, design docs, never forget to CC boss and the team. 
credit小偷来的时候,问老板,说谁谁让你具体做什么什么。识别假朋友,披着狼皮的羊
假装支持你做冒险的事情:如果真的有他们说的那么好,他们干嘛自己不去做(前同事Y,对我做过n次这种事情)。
自己做好research,确保自己的时间真的能够顾忌这些新的项目
有人会故意隐藏重要信息让你take action(前同事N)害你失败。别轻易相信。但是也不要公开说出来你的疑问,要神秘!!!
有人会故意传播错误的信息(比如故意在打印机留文件)来造谣。对策是广交朋友,为人正直
别人嫉妒你,做below the belt的事,你要保持平静,不要以牙还牙。不要把自己拉到他们的水平
神秘,神秘,神秘。假装被他们打击了,但是背后继续努力,用成功来反击。
有人会偷偷把你的名字从群发邮件里面去掉,让你错过会议。解法:找出此人,告诉老板。
如果老板是烂人,只能礼貌拒绝无理要求。
如果老板给太大压力,找朋友圈,跟你能影响到的人建立同盟。
选择你做的项目,尽量只做对你职业发展有利的。
Rotten tomatos: 如果被分到了也只能去做,但是问周围的人,是否之前失败过,是否有办法改动,增加成功概率
Stop whining. 如果你老觉得受到不公正待遇,这说明你“广交朋友”这一步做的太烂。. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
有些人会玩心理战术,动摇你的信心(前同事当中很多人对我这么用过,幸亏可以从其他source寻求信心)。
对策就是内心要强大,分清敌友。敌人说话当耳旁风,多喝点朋友的鸡汤
以上玩心理战术的经常还是领导,尤其需要小心(前老板做过这种事情,对别人,也对我。。。)"内心要强大“
有些人会假装给建议说”你太。。。“或者”不够。。。“其实是试图让你放弃自己优势
Be assertive: 不必羞于说自己的成就,偏好和长处。该拒绝的事情要拒绝。
”我答应他们你会做这件事“ -- 不是你自己同意的事情,不用做。别人没权利替你答应.1point3acres缃�
不要为了让他人高兴而答应做某事。
无论多生气,不必显山露水。dont take it personally
Don't take sides. 让别人自己去决断。
建立在老板心中的印象
Stay out of gossip。如果不想多说,温柔的转换话题
Keep written record of everything. 

https://www.quora.com/What-is-a-brown-bag-session
A brown-bag session refers to an informal meeting, training, or presentation that happens in the workplace.

Brown-bag, to me, indicates three elements:

#1, because the term brown-bag refers to the plain brown paper sack in which many people bring their lunch to work, it typically happens over lunchtime;

#2, for the same reason, attendees are aware that this is not a formal meeting where lunch is provided to them;

#3, since it takes place over lunch hour, it is optional for participants to attend because it is assumed they have an hour of unpaid time for lunch and they have chosen to use it to attend the session.

The presenter(s)  at a brown-bag session should be aware that the participants will be eating their lunches, and that contributes to the informal nature. Topics are typically "nice to know" but not "need to know" due to the optional nature of the session.

http://coolshell.cn/articles/17583.html
  • 高效的学习能力。这意味着——基础知识扎实、触类旁通、读英文文档不费劲、有寻找前沿知识的能力、能够看到问题和技术的本质、善于思辩、能独立思考。
  • 解决问题的能力。这意味着——你要高效的学习能力、见过很多的场景、犯过或是处理很多错误、能够防火而不是救火。
如果你拥有这两个能力的现象是—— 在团队或身边的人群中的显现出Leadership。
Leadership并不是当领导和经理,而是一种特征,这种特征有如下两个简单的表象:
  • 帮人解问题。团队或身边中大多数人都在问:“这问题怎么办?”,而总是你能站出来告诉大家这事该怎么办?
  • 被人所依赖。团队或身边中大多数人在做比较关键的决定时,都会来找你咨询你的意见和想法。
1、去顶尖公司
2、去真正的创业公司
好多创业公司其实并不是真正的创业公司,他们创业有很大的侥幸和驱利心理,要小心甄别。因为那不是真正的创业公司。
  • 你开始要关心并处理复杂的人事。尤其在大公司,大量的人都是屁股决定脑袋,利益关系复杂,目标不一致,每个人心里都有不一样的想法。这个时候再也不是talk is cheap, show me the code!而是,code is cheap,talk is the matter。你需要花大量的时间去思考和观察形形色色的人。需要耗费大量的精力在不同的人之间周旋,而不是花时间去创造些什么有价值的东西。
  • 你要开始学会使用各种政治手段。办公室政治不可避免,越大的公司越重,自从你开始成为一线的leader的那一天起,你就开始成为“里外不是人”的角色,需要在下属和领导,员工和公司之间周旋。随而你的级别越来越高,你需要使用更多的政治手段,你会学会审时度世的站队,学会迎合员工和领导,学会用官员的语言说话,学会此一时彼一时,学会妥协和交换,学会忍气吞声,学会在在适当的时机表现自己,学会波澜不惊,学会把自己隐藏起来,甚至你还会迷失自我,开始学会一些厚黑学,比如不得不在适当的时机在背后捅人刀子……你可能会成为一个你自己都讨厌的人
听上去真的好无聊,所以,你现在也明白为什么高层们都看上去很忙很累,而且抽不出时间来关心细节问题,因为,他们更多的是要协调整个组织和系统来运转,甚至还要四处周旋,各种博弈,没办法,这是职场的必需的东西!听起来是不是感觉人类很愚蠢?这真是没办法的事。如果你不想或是也没有能力玩这些东西,那么你需要去那些可以让技术人员安安心心做技术的公司。这类的公司,我见过Microsoft、Google、Amazon或是一些创业公司里都有。国内的大公司中也有让技术人员成长的职业成长线,但老实说,表面上看似是一个让人专心做技术的升职成长线,但其实还是管理岗位。
所以,技术人员在职场中的归宿有两条路 —— 到真正的技术公司成为一个专心做技术的人,或是在成为一个职业的经理人。
Make Something People Want(YC创业公司的slogan)
  • 能够去规划自己的个人发展的人,通常都是有很多机会和可能性的人。
  • 有很多机会和可能性的人,通常都是有Leadership,喜欢冒险的人。
  • 有Leadership喜欢冒险的人,通常都是学习能力强,思维活跃,喜欢折腾,懂得“投资”的人。
  • 学习能力强思维活跃的人,通常来说,都是喜欢看书,喜欢实践和新鲜事物,不怕艰难和挑战,用智力而不是使蛮力的人。
  • 懂得“投资”的人,通常来说,他们更多的关注的是未来和长远的成长,而不是当下的KPI、奖金和晋升。


Tuesday, February 2, 2016

Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman - 软件开发者路线图:从学徒到高手



http://read.lingyu.wang/apprenticeship-patterns/1.html
什么是软件技能

仅仅告诉人们去做事情并不能带来长久和可持续的变化。按照你的要求去做事的人如果遇到你的规则没有囊括的新情况,他们马上就会迷失。相反,还是同样的人,如果理解了支撑规则的底层因素,他们就能想出新的规则来适应任何情况

对软件技能的愿景,一部分是价值的提取,针对我们为写作本书所访问的技艺精湛的个人;另一部分是希望的表达,表达我们希望出现的社区类型。

如果你愿意钻研一件事,你就能做得更好,一切也将得以改善

注重实效而非教条主义
分享知识胜过隐藏独享
敢于实验并被证明错误
掌控自己的命运并为之负责,而不是等待别人给我们答案。

对于个体而不是群体的关注。我们追寻的是自身的改变,而非世界的改变

不抵制企业级软件开发、计算机科学或软件工程。一种有用的系统应该能够从软件开发社区的所有元素中识别并吸收那些最好的思想

我们以技能为中心,而非以过程为中心。拥有高超的技能要比使用“正确”的过程更重要。

最好的学习方法,就是同那些使用你要学习的技能来达到某种目标的人处于同一个房间里。

做软件学徒意味着什么

对于已经做完或者正在做着的事情,永远都有一种更好、更聪明或更快的方法来完成它。不断演进并寻找更好的方法,找到能使自己学会那些更好、更聪明或更快方法的人、公司和情景

做学徒意味着什么?本质就是这种对自身的关注和提高自身技能的要求。

做熟练工意味着什么

熟练工关注如何构建一些能彰显其技艺进步的更大的应用程序。力求拓展其技艺组合的广度和深度;他力求提升自己在社区中的位置。

熟练工的责任比学徒更广。同样,他的失败也会带来更多的损失

做师傅意味着什么

精通意味着关注如何将行业向前推进

达到技能和技术的炉火纯青
创造直击软件开发本质的新工具
师傅将高级技能的获取、使用和分享看成是身为软件技师的重要方面。

学徒期是什么

多数人都只能在不太理想的环境中磨砺他们的学徒过程

寻找好的老师并利用在他们身边工作的机会来学习

下一步做什么

在你的职业生涯中,学徒期是你关注自身成长超过所有其他东西的一段时间。这是你暂缓直接最大化收入潜力的野心,从而最大化学习机会的一段时间
最新最早最热

第二章——空杯心态
成功的学徒所需的一种态度。已有的经验越多,你就越需要更多的努力进入到“空杯”状态,清除思想中的坏习惯,放下对技能水平的自鸣得意,敞开自己,从更有经验的同行那里学习不同的而且常常是违反直觉的新方法。

入门语言

基于书本或者文章中那些短小的、人为设计的例子来学习是有局限性的,你将失去学以致用带来的好处,毕竟,你在工作中要做的是解决问题

靠自己也可以学习一门语言,但除非与专家交流,否则你需要更长的时间来领悟语言的精神。

选择了一门语言,就意味着选择了一个虚拟的实践社区,这个社区里有成型的惯用思想、社交集会方式和沟通机制

如果能加入一个肯共享代码的社区,带来好处之一就是可以超越对简单语言结构的学习,并开始用惯用的语言思想来表达自己。

几年之内,第一门语言将是你学习其他语言的框架。第一门语言学得越好,下一门语言学起来就越容易

在非常规的方向上延伸一下语言的使用能帮你发现语言的强项和弱点。

在编程语言的情形中,被塑的不是头盖骨,而是我们思考问题、形成想法并把这些想法运用于特定问题的方式。第一门语言将在你整个职业生涯中成为你的“母语”而一直陪伴着你。不要让你对它的精通阻碍了自己对其他语言的学习和使用

你不应该“嫁”给任何特定技术,而应该有足够宽的技术背影和经验基础,使自己能针对特定的情景选择好的解决方案。 行动指南

找一份语言规范(specification)来读一读

白色腰带

在对自己已有的技能保持自信的前提下,当接触到新情况时,你应该先放下已有的知识

训练自己暂停已经习惯的编程机制,这会使你发现新的可能性

释放激情

不要让任何人压抑了你对软件工艺的兴奋——它是一种宝贵的财富,它将加速你的学习。

如果你发现自己处在一个无法接受你激情的团队中,那么你将需要想些办法来养护自己的激情。

思想的多样性应看作集体智慧的关键因素。

具体技能

你应该学会并持有一些具体技能。

在技能水平达到一定高度之前,在特定的工具和技术领域拥有具体的、可展示的能力还是会增大团队信任你,相信你能对他们有间接贡献的可能性。 行动指南

确定其中哪些是对你要加入的团队是直接有用的。总结出一份计划,设计一个可证明你掌握了这些技能的玩具项目。然后实施这份计划。

要养成定期把自己的履历审查一遍的习惯。一边看一边把具体技能提取到一份单独的列表中

暴露无知

向那些依靠你完成工作的人说明:学习过程是交付软件的一部分。让他们看到你在成长。

把真相告诉人们。让他们知道你已经开始理解他们想要的是什么,而且正在学习怎样把这样的结果交给他们

暴露无知,最简单的方法就是问问题

经过时间和实践,直接去问团队里最明白的人会成为你的习性。在暴露无知的同时,你也向团队展现了自己的学习能力。而且,有时他们也能从回答问题的过程中对自己的知识获得新的认知。

你的本能告诉你要掩饰自己的无知,装作通晓各种专家知识,但这只会阻碍你的成长,并阻止你完成正在尝试的工作

技师所拥有的重要品质之一就是学习的能力,他们能找出无知的领域并通过努力工作来减少这样的领域。

正视无知

选出一种技能、工具或技术,积极地填补跟它有关的知识空白

对于某些人,最好的方法可能是阅读能接触到的所有文献和FAQ,来获得知识概览。其他人则可能觉得直接动手构造一个“质脆玩具”才是理解一样东西的最有效途径。不管哪种方法适合你,都不要忘了问问周围的“同道中人”和指导者,看是否有人已经掌握了这项技能并愿意分享所学。

公开地学习是学徒开始向熟练工跃进的途径之一

如果因为你的学习需要而妨碍了项目的成功发布,你的老板也不太可能谅解你。总之,你需要保持足够的警觉,不能让你的学徒期成为团队的问题。把更大的团队利益置于个体利益之上,而不是利用团队和客户来促进个人成长。

深水区域

只有承担艰巨的任务并做一些让人紧张的事情,你才会成长

意味着当提升或者外部的任务被安排到你头上时,即使面临着极高的失败率,也要勇敢地接受它。为失败做好准备并从失败中振作将为你打开怯懦者永远看不到的大门

以退为进

如果你真的在挣扎,或者说在深水区域你难以让自己的脑袋浮出水面,那你就应该寻找暂时回退的机会。有时你需要后退一步才能前进两步。

利用短暂的休息向聚集在你周围的指导者和“同道中人”寻求支持。有了他们的支持,再加上最近一次展现能力的推动,你可以准备得更充分,从而能够应付再次尝试时前进道路上的碰撞。

总结

最坏的情况是你根本不知道自己无知,如果你能意识到自己缺少的东西并补充它,你就向前迈进了一步
最新最早最热

第三章——走过漫漫长路
漫漫长路

要在编程方面真正擅长需要一生的努力,还有不断学习实践的进取心

在学徒期,相比薪水和传统意义上的领导能力,你要更看重学习和长期成长的机会。

技重于艺

技能建立在牢固的关系之上。相对于增加个人利益,要更重视向客户交付价值。作为技师,你的首要工作是构建能满足他人需要的东西,而不是沉迷于艺术展现。沉溺于制造漂亮但无用的物件不是技术。

必须在两件事上取得平衡,一是客户期望提供针对问题的直接解决方案,二是你成为技师总要有个内在标准。功用和美好并不对立,而是相辅相成。一款软件越有用,软件拥有高质量就越重要。但质量需要时间来保证。你必须不断地在美好和功用之间折中,从而向着适当的质量级别前进。

持续动力

有一类软件可以赚钱,有一类软件写起来有趣,这两类之间却没有太多的重叠。如果想挣钱,往往就被迫去解决那些非常难处理、没有人能轻松解决的问题。

培养激情

要成为熟练工,你需要拥有对软件技艺的激情。

处在恶劣的环境中,你很难培养自己的激情,但你可以采取一些基本的行动来维持它。

做点自己喜欢的事情
加入一个关注你要深入学习的某样东西的本地用户组。
当你的激情陷入危险处境时,可以让自己沉浸到软件开发领域的杰出作品中,这可以帮你越过难关。
有时你的需要、目标和抱负会跟老板提供给你的职业道路相抵触。可以考虑换到一个新的、能提供适合自己的职业道路的组织。要培养自己的激情,需要设置一个清晰的界限,基于这个界限来定义你愿意身处其中的工作环境
要保持你在14岁时对编程所抱有的新奇感。如果你担心现在的工作正在让你的大脑腐烂,那它很可能确实是

自定路线

为自己的职业生涯确定一个合理但又须付出努力的下一步。到达自己的下一步,然后继续制定整个过程直到抵达理想的目标,这都是你自己的责任。

有一点至关重要,就是一定要走出第一步,即使它看起来意义没有那么大。第一步会产生一种冲力,协助你向着自己的目标前进。

不要仅仅写下上层的目标,尽量制定细小的、可达成的步骤。这些小步骤会提供一些反馈,你可以利用它们来修改自己的路线,这些小步骤还能使你能更容易地从“同道中人”那里获得帮助,从而达成自己的目标

成功的学徒们所走的道路都有很多相似之处。之所以有这种相似,是因为每一名学徒都会有意或无意地基于一组相互重叠的价值来选择生命的路线。

应该不断重新评估自己的路线。路线永远是自己的,你可以在任何时候重新描画它

评估是(短期)更响亮的头衔和更丰厚的薪水重要,还是一个更符合自己的目标,从长期来看能让自己飞得更高的公司重要。

太多的组织把人员分类,并采用一种目光短浅的方式对待组织的人力(或“资源”)

使用头衔
不要让头衔影响了你。它只是一种娱乐,你应该在意识中将它边缘化。你可以使用头衔来评估你的组织,但不能用来评估自己。

坚守阵地
一个人一旦停止了实践,她对技艺的精通就马上开始消退。”每一个不写程序的日子,你都是在不断远离熟练工的目标。

另辟蹊径
沿着自己定好的路线走,记住自己在学徒期学到的东西。
即使永远地离开原来的道路,在这一路上你所形成的价值和原则也将一直陪伴着你。
如果你离开了软件开发,你会发现不管自己去哪里,像严谨的思考以及将涉及大批量数据的任务自动化这样的习惯仍将对你有用。不管你选择什么样的未来,你过去做软件技师的经历都能使之更加丰富。

第四章——准确的自我评估
聪颖而且努力的学徒千万不要对自己的成功自鸣得意。在软件开发领域,超越平庸是很容易的,因为有太多的人只超出平均曲线一点点就开始满足了。你必须去追寻那些技艺精湛、学徒甚至无法想象其水平的其他团队、组织、熟练工和师傅,向他们学习,以此来抗争趋于平庸的倾向。

你必须愿意放下自己已经感知到的能力

只求最差
宁为狮尾,不为狐头!
让周围多些水平比你更高的开发者。找一个更强大的团队,在那里让自己成为最弱的成员并拥有成长的空间。
处在一个强大的团队中能使你“感觉”自己工作得更好。团队的其他成员经常阻止你犯错误,并帮你平稳地从错误中恢复正确的结果
作为团队中最弱的一员,你应该比其他人更用功。这是因为你的目标不是保持“最弱”,而是从最后面开始一路赶上去。没有这种集中精力向团队学习的意识,你会面临多种风险

你面临拖累团队速度的风险
由于好的团队不会(长期)容忍某个成员只是来做一回过客
为直接给项目增添价值,你特意去做些打下手的任务。开发“具体技能”会增加你对软件开发过程的贡献,而且这是学徒这一角色的根本。没有这类贡献,该模式会导致强大团队被严重削弱。你对团队快速增长的贡献会成为这些强大团队愿意冒险拉你入伙的理由。

找人指导
找那些走在你前头的人,努力向他们学习。
如果你最终发现找到的老师不适合自己,那首先应该想想自身的问题。可能你的期望值过高,没有哪个老师能达到

但困难来自两方面:
这些人可能没兴趣指导别人
跑出去做一件请求别人“指导学徒”这么奇怪的事情会让自己有说不出的胆怯。
要记住,被一位潜在的指导者拒绝或者认为你奇怪的概率并不高,而潜在的回报却是巨大的

同道中人
为保持前进的势头,特别是当找不到全职指导者的时候,你需要找到那些所走的道路与你相似的人,跟他们保持频繁联系。因此,你应该去找一些像你一样希望自己优秀的人。
社区的健康度可以通过它对新思想的反应来衡量。今天持不同意见的人可能是明天引领新思潮的人

密切交往
找机会跟另外一个软件开发者坐在一起,肩并肩完成一项实际动手的任务。有些东西,只有当你跟另外一名开发者坐在一起完成共同目标的时候,你才能学会它。
总会有一些细微的技艺,只有跟一个同事近距离合作才能学到。这些技艺通常被认为太琐碎,没人会在教别人的时候提到它,但它们的影响却可以累加起来。

打扫地面
主动去完成简单无趣却又必须完成的任务。这是一种可以尽早为团队的成功付出努力的方法,因为它表明你能完成高质量的工作,即使这种工作看起来无关紧要。在任何项目中敷衍这一部分的质量都会导致日后的麻烦。

通常,你会关注风险更低的系统边缘部分,而不是常常带有大量依赖性和极高复杂度的核心。
不幸的是,在工作岗位上,你受到的教育并不如你认为的那么有价值。那些教育背景只能抬高人们对你的期望,期望你第一天就能交付更好的结果
会面对另一种风险:无法将前期的成功转变成请求更有挑战性任务的理由。另一种负面结果是:你发现自己害怕去做除“打扫地面”之外的任何事情。还有一种风险,如果只做琐碎的任务而没有更高的前后一致性,你会无法理解更大的图景。寻找各种机会证明自己能做更高级的工作

总结
谦虚是成功学徒过程的基础之一
与自己的志向结合,谦虚能让你集中精力,并保持沿正确的方向前进。没有谦虚,你很容易过早地宣告自己学徒期结束,并遗漏一些重要的课程。

第五章——恒久学习
软件开发由两种主要的行为构成:学习和交流
学徒期的主题就是学习,成功学徒的显著特点就是能证明自己的学习能力。学徒总是渴望有机会用技能替换自己的无知

提高带宽
学会那些本来不会做的事情,常常比去做已经会做的事情更加重要。
你一直像使用吸管喝水那样慢慢地汲取知识。但在学徒时期,有时候你必须快速地吸收那些就像从消防水管喷涌而出的、大多数软件发者都能获取到的知识。
提高获取新知识的能力是关键一步,尽管有时知识会多得让人崩溃。你必须开发一些必要的方法和技巧来高效地获取、理解、维持并应用新知识

注册成为博客聚合器的用户并开始订阅软件开发方面的博客(blog)。
从Twitter上跟(follow)一些软件大师,留意他们正在做什么。
订阅流量较高的在线邮件列表,重现别人遇到的问题并尝试回答他们的提问。
加入一个新成立的对某种新技术比较兴奋的本地用户组。
说服老板送你去参加技术大会。
在读完一本书之后,写封简短的邮件与作者联系一下,表达一下谢意,问一点问题
不要忘了网上有成百上千的在线教程、播客(podcast)和视频(如Tech Talks的广泛系列),可以从iTunes和YouTube免费下载。
理解何时“提高带宽”。

不断实践
在一个可以很轻松犯错误的环境中,花点时间不受干扰地实践你的技艺。
在软件开发中,我们是在工作中实践,这也是我们会在工作中犯错误的原因。我们需要找到把实践与职业分离开来的方法。我们需要实践期。
实践过程需要结合较短的反馈回路。虽然理论上实践是有益的,可如果你得不到周期性的反馈,你很可能养成坏习惯。
每天选择正确的事情来实践是一种技能,这几乎跟反复实践这一行为本身同样重要。

质脆玩具
设计并构建一套玩具系统,此系统从使用的工具集上(而不是功能范围上)与你在工作中构建的系统类似。通过这种方式为失败做出预算。
如果来自失败的经验可以与来自成功的经验一样多,那么你需要一个相对私有的空间来寻求失败
构建玩具包含了对新事物的学习,而且提供机会让你在特殊的环境中加深对手中工具的理解,这个环境不仅安全,而且你仍有余地来更好地服务自己作为一名用户的需求

使用源码
找别人的代码来读一读。从你日常使用的应用和工具开始。作为学徒,有一种想法会支持你阅读代码的信念:那些构建了你所用工具的人多少会有点与众不同,或有些特别,或比你更厉害。阅读他们的代码,你可以学会像他们那样写程序,而更重要的是,你将开始理解创造了你所用工具基础架构的那些思考过程。
除了阅读他人的代码(并在别人需要时提供反馈),也试着找找周围有没有人有兴趣阅读你写的源码。若能拥抱他们的反馈,并从中滤除纯个人的偏好,你将成为更好的程序员
通过阅读其他人编写的各种好的、坏的以及无关紧要的代码,你会慢慢学会特定语言社区中的各种惯用法和精妙细节

且行且思
自我反省是困难的,但我相信我们能从失败中学到的东西比从成功中学到的更多。
在软件开发领域做一名会思考的从业者。这包括经常反思自己的工作状况。考虑一下自己的实践是新颖的,创新的,还是过时的
这种观察、反思并改变的过程并不只限于你自己的行为。你还可以悄悄地观察团队中的熟练工和师傅。思考他们使用的实践、过程和技术,看看这些东西能否跟自己经验中的其他部分关联起来。

记录所学
在日志、个人wiki或博客中为自己的行程做个记录。将自己学到的经验按时间顺序记录,这会给你所指导的那些人提供一点启发,因为它使你的经历更加明朗,另外也为你自己提供了可以利用的重要资源
尽量避免落入写下经验之后就忘记它们的陷阱。定期读一读以前写的东西,你就能保证这一点。试着在每次重读这些资料时都找到新的关联。

分享所学
要在学徒期的早期就养成定期分享所学经验的习惯。

建立馈路
技艺不精的人常常不知道自己技艺不精。再者,越是技艺不精,你越不善于评估自己和他人的技能。
建立一些机制,定期收集关于自身绩效的相对客观的外部数据。通过尽早、经常而且高效地寻求反馈,至少你可以提高知道自己不行的概率。
批评本身不太会成为有用的反馈,因为它没有告诉你别人期待的究竟是什么
有用的反馈是这样一类数据:你可以基于它采取行动,而且它能针对某种特定行为给出多做或少做的选择。
加强型反馈鼓励你多做某事,平衡型反馈鼓励你少做某事。
一个学徒不应该过早地致力于不犯错误,而应该尽早找出如何确定错误的办法。一旦学徒能确定他们的错误,从错误中学习就容易得多了。

学会失败
天赋常常被误解。它并不是超常的智力,而是一种性格。它最需要的是一种承认失败、不遮掩缺点并努力改变的意愿。它来自于刻意的,甚至强迫性的对失败的反思,以及对新方案的持续探索。
设法确定你常常会在哪些情况下失败并试着解决那些需要改正的方面。真正的目标是让你对导致失败的模式、条件、习惯和行为有所自知
知道了那些使你失败的事情,你就可以在修正这些问题和减少损失之间做选择。

第六章——安排你的课程
阅读列表

维护一张“阅读列表”,用它来跟踪你打算阅读的书,并记下已经读过的书。
任何一本书,你能从中获得的最有价值的东西就是一列值得阅读的其他书目。
由于阅读列表实际上是个优先级队列(priority queue),最终你会发现有的书已经在队列中下沉得太深,你可能永远也不会再读它们了。
开始时挑一本宽泛的书,让自己对目标主题有大致的了解;然后选择一些内容具体的书,从而掌握该主题中自己感兴趣的方面。
比起乱读一通自己还没有相关经验的书,或者乱读一通自己尚不具备相关预备知识的书,在合适的时间读合适的书会有更好的效果

坚持阅读
重视你对学习的如饥似渴,消化掉尽可能多的文字。在你构建“阅读列表”的过程中,要更加重视书籍,而不是博客。
这一埋头阅读的过程也应该包含对学术界大量知识库的探索。读一些偶尔翻到的研究论文可以拓宽你的思路,与计算机科学发展的前沿保持联系,而且提供了富有挑战性的新思想的源泉

钻研名著
暴露无知”,向别人请教那些自己不知道的概念,以及它们出自何书。将这些书加入你的“阅读列表”。
在你的阅读列表中,要确保经典名著和现代的、更注重实效的图书和文章混合出现。

深入挖掘
学会深入挖掘一些工具、技术和技艺。对知识的学习要达到“知其所以然”的程度。深度意味着要理解导致一种设计的推动力,而不仅仅是设计的细节
对自己构建的系统,你可以真正解释其内部机制。

从第一手资料中获取信息
找出是谁第一次提出了那种思想,弄明白他们当初想要解决的问题。这样的上下文通常在思想四处传播的过程中由于各种转译而丢失了。
阅读教程的时候,不要去寻找可以复制的代码,而应该寻找可用于放置新知识的思想结构。你的目标应该是理解某个概念的历史上下文以及它是否是另一种思想的特例。
你的目标是:不影响自己对软件开发各方面相对重要性的基本观点,在这一前提下,让自己获得足以解决任何问题的专业化知识
如果只拥有表面知识,另一种可能的后果是:你会永远意识不到自己正尝试解决的问题要么已经有了众所周知的解决方案,要么根本是不可能的

常用工具
找出一组常用的工具并关注它们。最好这些工具都是你不再需要阅读文档的。有了这些知识,你就能对工作中的特定部分提供可靠的时间估算,从而将风险限制在新的、未探索过的领域上。
可用于完成工作的最佳工具并不是你最熟悉的工具。在学徒期使用的工具到你变成熟练工时肯定会变得过时。最终,你所钟爱的所有工具都将变成垃圾。为了职业生涯的成功,你必须学会从容地获取或放弃一些熟练工具
最优秀的那些人可以稀松平常地做出大多数人认为不可能的事情


Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts