Why people don’t work hard with good social welfare

People often say that countries with good social welfare lose the drive for economy because people don’t have incentive to work hard anymore. The inherent assumption is people are naturally lazy so they don’t work if they don’t have to.

However, I always think good social welfare is probably not the cause. The cause might be the outdated education system. Because if you look at the kids, they work their asses off trying to be good at something although they are in very good social welfare–their parents take care of them. However, the education system, which is designed for the industrial age to serve mass production, take children’s curiosity away, together with their ability to learn. You need that for mass production because you need a lot of people to work on the assembly line to be part of the machine.

But times have already changed. We are already deep in an information age. And a lot of developed countries already have the luxury to provide good social welfare for its people. But their education system are still locked in the industrial age. They need a new kind of education, which lifts the scaffold that the current education system puts on people.

The current education system is like ancient Chinese footbinding bandages. It should be thrown away a long time ago. Let children learn and grow themselves. Keep their curiosity alive. Keep learning continuously. So I am sure they will continue to work hard even in a high social welfare country. Just like they have played so hard when in childhood.

I kind of think the great innovation in software in north European countries have a lot to do with the fact that people there enjoy lives better and have less pressure to make a living.

发表在 selflearning, 未归类 | 留下评论

New Generation of Textbooks

Recently I wanted to review the “knowledge” I have “learned” at schools. There is a lot of that kind of “knowledge” that was “learned” but never practiced. I am thinking that I need to review my old textbooks and notes. However, I don’t have them with me now. So I think I probably can just look them up online. They might be scattered here and there online. But I think that should be fine for me. I don’t have to learn them all at once. Also I only hope to gain a better overall understanding of what kind of things I have learned in the past. I have no intention to go very deep into any field without any hands-on project to practice with. So learning can be fragmented and layered. Fragmented is ok as long as you can achieve a layered understanding in a period of time.

And I feel the materials and my understanding gained along the process might just be a good collection of learning materials for others. So everyone can review their past “dormant” knowledge from time to time instead of having them locked in deep memory. Also this way can also be used to write new kind of textbook online. Nowadays the textbook has been extremely outdated with latest industry knowledge. For example, in the software field, the knowledge is updated so quickly that it is very hard for traditional textbooks to keep up. We need digitized knowledge and digitized process of knowledge production.

If we are able to digitize the kind of “knowledge model” that everyone is continuously constructing in their minds and testing against others’, the best quality of those models might be used as “textbooks”, and I can see this field in more fluidity and not as divided as it is now. For example, industry professionals can be knowledge producers as well, instead of waiting for those specialized professors to translate knowledge into textbook with very long production cycle.

发表在 实验 | 留下评论

From Agile to Life Centers (Draft)

Dijkstra said in the 70s that the irreversible damage is done once we have named this subject “Computer Science”.

“…the topic became —primarily in the USA— prematurely known as “computer science” —which,actually is like referring to surgery as “knife science”— and it was firmly implanted in people’s minds that computing science is about machines and their peripheral equipment, which is not true””–from Wikipedia.

Now we see the damage.

Those of us who work in the software industry know that there is a huge divide between tech and product people.

There is a general distrust of engineers:
1. engineers cannot manage, not even manage themselves. So they need to be managed
2. engineers don’t care about products and don’t know about design

Both of these are not true. My experiences told me otherwise. Engineers dislike management, mostly because management doesn’t understand software and so the management is a lot of obstacles to software engineers. Since software engineers don’t see the hope of changing the situation, they would rather stay in their corner and be happy to just focus on engineering. I know this is true for a lot of software engineers.

As for caring about product, software engineers care about product and design greatly if you give them the chance. When I was working as CTO for a company, I had a design session that goes along with weekly meetings. The software team members take turns to share with others what they see as a good design or a bad design in their daily lives, and why it is good or bad. So engineers discussed toilet, road/subway signs, light switches, power sockets, organization structure, and so on. I take the opportunity to introduce to them various related design topics when we are discussing design of one thing. And engineers get very excited about design of various things, including organization management, social policies, and so on. Who said they don’t care about product? Who said they don’t know about design?

The engineers in the above example is from a conventional company that is going online. They have shown disinterest in company product and management, and are believed by the company management as cannot be trusted on responsibilities (sounds familiar?). They didn’t care because the management didn’t want them to care and didn’t give them the time to care. For a change, I let engineers take Friday afternoon off to just focus on product. I don’t assign any engineering tasks to them for that half day. And they just use the time to play with company product. And with inner source environment I built up, engineers can initiate projects that they deem important for company product. And we have important projects sprung up because of that. For example, an IM product/software for our eCommerce platform.

If you give them the chance, they will care, because that is what software programming is about.

These two assumptions are not true probably for all engineers. But particularly, it is not true for software engineers at all because of the uniqueness of software.

However, for the general public, people assume the above two misconceptions about software engineers, due to the misnaming of this subject—Computer Science, and more in depth due to the fact that software is complex and invisible. (You can only see it if you do hands-on practices. Very much like society or sociology is invisible, and you have to “see” it with your hands-on practices.)

“We have everything ready, we just need a programmer!” is the typical expression that reflects the common mass’ perception of software engineers.

When there is a divide, usually it is because it is difficult to possess both qualities. Since we called this subject “Computer Science”, it is believed to be a purely engineering major. So then there should be people who study liberal arts majors to manage these software engineers, because typically we believe engineers are narrow minded, not able to communicate well, and don’t care about management and product. And we know our schools taught these two groups of people like they are totally different, and there are generally no much coverage of liberal arts for engineering students.

Thus we have product people and engineering people in every company. And very often they fight each other. Surely a lot of decisions have to be made on the whole since product is one whole piece and is not separated by product vs engineering. So very often we see the boss or one of the founders sit on top to make the important decisions, even though s/he is not capable of making those decisions. It is assumed that it is easy to understand what is in software. And there is no understanding that great skills and years of experiences are needed to plan product and software together and it is very strategical for a company whether it can plan the software/product well.

“Dijkstra was the first to make the claim that programming is so inherently complex that, in order to manage it successfully, programmers need to harness every trick and abstraction possible. ”–from Wikipedia.

Complexity of software demands ability in both liberal arts and engineering. Society is complex and invisible, thus you need to do a lot of hands-on social practice and do very extensive reading to help you “see” things and understand human society. Similarly, as software is essentially a digitization and innovation of human society, it is also complex and invisible. You needs hands-on practices, e.g. coding to “see” things and understand it. Since it is about digitization and innovation of human society, you also needs a very strong liberal arts background. Not the kind of liberal arts education you get from college, but more street-smart liberal arts capacities achieved only by a lot of social practice and a lot of extensive reading. For a small example, knowing of the human history helps you innovate better.

So maybe now it is easy to understand why such a divide between product people and engineering people. We can say that is because product people are not really product people, they don’t possess the true liberal arts capacities, and cannot think logically. They are just chatty. And our engineers are not true engineers because they focus so narrowly only on the engineering aspect of the software programming, and cannot grasp the vast realities and possibilities outside of engineering domain. Or we can say we just need people who educated themselves in liberal arts and have a lot of hands-on experiences with coding. Since software programming is so big and encompassing so many things, it is challenging for an individual to learn all these things and be good at all of them. But it is reasonable to expect a general good grasp of both and be a little leaned towards one side or the other from time to time, with the ultimate goal of achieving the level of greatness in both regards.

And that is possible. We have seen great examples of people who have achieved that greatness, and we believe it is a path that everyone can try.

I believe Jeff Bezos, Larry Page, Steve Jobs, Bill Gates, Mark Zuckerberg, Linus Torvalds, Guido Van Rossum (for Chinese ones: Huateng Ma, Xiaolong Zhang, Lei Ding, Bo Yang from Douban…) are these good examples. And we also see many other smart creatives as touted by Eric Schmidt’s book “How google works”. I believe all great software companies understand this and know how to build up organization accordingly to tap into potentials of software engineers, such as google, amazon. And those who don’t, disappear after a while even if they can have a short period of success.

We have to bridge the divide. Without bridging the divide, there is no real solution for the industry. We have to point out a path and show the examples.

Without detailed elaboration, just let me briefly outline my understanding of this path:

  • emphasize caring of product, emphasize responsibility for full life cycle of the software like amazon has practiced (Douban as an example as well). Give developers dedicated time to care about company products. Give them rights to initiate products on their own (like Douban has practiced, and inner source environment can legitimize, empower and reward such behaviors.);
  • emphasize on programming as the core. Like the core curricular in college, programming should be the core skills you have to learn no matter you are developers, QAs, devops, product managers, and so on. In the words of facebook director of engineers, if you are doing any software related job, your best way to prepare yourself for that job is to learn how to program. Build up an inner source environment with rich projects of various scales and difficult levels that people can pick best projects that suit their current capabilities. People including non-engineers can be free to contribute to any inner source projects and learn various programming skills. Remove the artificial barrier that blocks communication between developers, QAs, devops and product managers;
  • emphasize on design skills training. Such as the design sessions that I practiced in my previous companies. Such design skills are inherently connected to architecture and management skills. In a sense, it is a more advanced level of coding;
  • give people ownership in those independent projects of various scales. That is how people learn of programming, design and management. They need to feel the whole and develop the sense of it. The wholeness is essential to programming and here I use the word programming as something that is very broad.

So we do have a path that can connect liberal arts with science/engineering and making them mutually benefiting each other. You don’t have to struggle between whether you should go product direction or engineering direction. You just try to be good at both, and make the two Ying and Yang of one whole body. They are parts of the whole thing of digitizing the world and making the world a better place with great and kind innovations, thus truly making software programming the greatest ever invention of human history, an invention that empowers us to break the long time barriers to equality and happiness of mankind.

One great person who has been trying hard to bridge liberal arts and science is Christopher Alexander, whose design pattern theories in the 60s, 70s have greatly influenced software community, and directly brought up the design pattern, OOP, extreme programming, and agile programming movements. However, during a speech of Christopher Alexander, when asked to comment on his influence on software community, he said that in his observation, software community has only scratched the surface of his theory, quote “Software Programming’s use of patterns have so far just been a neat format that is a good way of exchanging ideas about programming, but lack in the two other dimensions: MORAL CAPACITY in producing a living structure and the GENERATIVITY OF THE THING and that is capability in producing a coherent whole.” (http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=795104) His latest theoretic framework, as summarized in Nature of Order, has used concepts like life centers and degree of life to push his works to a whole new level. However, software community has barely touched on these and probably have no idea how to tap into it.

So by bridging the gap between product and engineering, and realizing the true nature of software programming, I hope not only that we can resolve the great divide in our software industry and help the industry grow more healthy (as we see software nowadays is really expanding to all corners of human society, literally “eating the world” according to Mark Anderson), we can also to bring up a new (real) kind of software engineering that seamlessly bridge liberal arts and science/engineering, tap into the great potential of Alexander’s great theoretic framework that bridge the gap between subjectivity and objectivity, and make complete the modern science.

发表在 Software | 留下评论

Software is Unique

Software is the bridge btw the human world and the physical world. It is the bridge between human science and physical science. It is about giving ideas concrete forms. It is about digitization of life. It is about creating life.

  • Software is broad. You have a large variety of lives, so you have a large variety of software. Life manifests itself in different forms in various software. How many species of plants and animals you have on this planet?
  • Software is deep knowledge about human world. Since software is digitization of various life forms, if you understand software, you understand better of life.
  • Software takes many years of continuous hands-on learning.
  • Software is complex, just like life can be very complex. So we try very hard to make it as simple as possible, but not simpler. Software is about taming complexity.
  • There is no software architect who doesn’t do intensive programming anymore. Maybe it is ok in other disciplines to have architects who don’t do hands-on work anymore, but not in software.
  • Software planning is strategic. Like a soccer team needs a coach to plan things strategically and build up the team, so is a software team. If you have a software architect in the company possessing those comprehensive skills, cherish her/him, let her/him make the decisions and be responsible for them.

If this list is too short, I hope people can keep it in their minds to contemplate on constantly when working with software, and I hope this list is enough to turn around people’s common misconceptions about software.

发表在 Software | 留下评论

Software Management

I am trying to summarize a short list of what I deem the most important for software management.

  • Management is about the right people making decisions. It is about forming the trust and delegate chains.
  • Emphasis on programming skills. Everyone should try to learn programming.
  • Break the boundary. People should not be separated way too early into testing people, system admins, developers. They should try to learn the comprehensive programming skills, which include how to do testing and how to run servers and do deployment. Testing people and system admins are encouraged to learn programming.
  • Programmers’ time is the most precious.
  • Empower programmers instead of putting various kinds of restriction on them. Give them the best tools. Let them fly!
  • Programming takes a lot of learning. Understand this! Value employees’ learning! Build up a rich learning environment! Have architects who can mentor people.
  • Rich projects to build up a comprehensive learning environment. Projects of different size and difficult levels, many of which are independent projects that are not tangled with other projects. So every individual in a software team can find projects that fit her/him to improve step by step.
  • Emphasis on product. Everyone in the software team should care about the software that s/he is building. Thus everyone should care about the product. Dedicated time (for example, Friday afternoon) is allocated for software team members to do nothing but playing with the product.
  • Emphasis on design skills and cultivation of programmers’ architect skills. Design sessions are scheduled regularly, when team members take turns to tell what s/he has found in her/his daily life that has a good design or bad design and why. Various design topics will be covered during such design sessions.
  • Do pair programming and code review very often to help programmers improve programming skills.
  • Software planning is strategic. Like a soccer team needs a coach to plan things strategically and build up the team, so is a software team. If you have a software architect in the company possessing those comprehensive skills, cherish her/him, let her/him make the decisions and be responsible for them.
  • Hiring is an important window for a software company. Tech director should be in charge of hiring of engineers and pay attention to the details in the hiring process. Tech director should have the directions in how s/he wants to build up the team and how to build up a good public image of the company as a tech company in order to attract talented engineers.
  • There is no software architect who doesn’t do intensive programming anymore. Maybe it is ok in other disciplines to have architects who don’t do hands-on work anymore, but not in software.
  • Everyone is building stuff. Everyone is a builder. No one is just a talker, doing management only. This is from Spotify founder Daniel. And I understand it as an important way to cut down communication cost in software management. I think at least for software management, this should be enforced. It might seem radical to enforce this at the whole company level. But I would love to see that happen, and I tend to believe that should be a very good thing for the software company.

This list might not be comprehensive. They are what I can think of off the top of my head. Maybe they are what I deem most important. Or it might just be related to my recent experiences. Time will tell, I think. If it is short, I hope people can keep it in their minds and constantly get reminded in their management of a software company.

发表在 Software | 留下评论

Management and life centers

Management is about the right people making decisions. It is about forming the trust and delegate chains. It is about hierarchy. Don’t be afraid of hierarchy, because life is full of centers. To have something that is full of life, life centers need to be formed naturally. To have an organization that is full of life, life centers also need to be formed. The forming of life centers in an organization is exactly about “right people making decisions” and “forming the trust and delegate chains”.

So don’t be afraid of hierarchy. Every organization has hierarchy. The right question is how many levels of hierarchies there are in an organization, there are too many or too few, whether there is natural flow btw hierarchies, whether there is transparency, whether there are still channels of communication across hierarchies, and etc.

This hierarchy is totally based on individuals’ ability to make the right decisions in this domain. And it it about making decisions and taking responsibilities for your decisions. It doesn’t extend to to your personal life (this part is usually quite difficult for people coming from the oriental world to comprehend).

I have seen startups where bosses seem to be afraid of hierarchies. They are afraid to delegate any responsibilities and authorities to other people. It seems they are trying to maintain a flat structure, but in reality, the bosses often become the sole authority in the company and make decisions on every level. A lot of micromanagement indeed.

Finding the right hierarchy, having the right people at the right positions and at the same time maintaining natural flow between hierarchies and transparency are what management is all about. In short, management is about center of lives.

I often say that software is about creating lives. Thus you can see why I say software and management are inherently connected. I don’t see a software engineer as a good software engineer if s/he cannot do good management. However, what we often see in the industry is that a lot of people tend to think that software engineer cannot do management, and thus management belongs to people who can not do software. It sounds bizarre. However, that is how many software companies are run today. What a tragedy if you run a company like that!

发表在 科学研究 | 留下评论

我是如何进行年度回顾总结的

English Version

我的不少朋友都是喜欢做年度回顾总结了。从去年年底起,一直到春节,就陆续看到他们的年度回顾登台了。我利用春节几天,也做了个年度回顾,因为平时自己一直记录学习笔记,所以这个年度回顾也是在笔记本上完成的。虽然有点姗姗来迟,下面也跟大家分享一下我是如何做年度回顾总结的。

首先给大家我笔记本上去年的一个年度统计数据,一共记了3176条笔记,其中有2007个便条,647个网址,515个网摘,7个知识包。 另外也统计了各年度最常用标签,年度产生的新标签等等。关于这个统计功能和页面,请看另一篇专门介绍新开发的统计功能的文章。

通过年度统计数据,可以很快的了解一整年的大概的情况。然后就是使用笔记本的日期过滤中的浏览去年功能,让笔记本只显示去年2014年里的笔记。通过快速浏览,可以大致发现这一年需要回顾的几个大的主题,比如管理,软件团队管理,产品管理,技术(包括其中具体的几个技术专题如git, python, shell, database),osl发展,notebook设计和开发。然后就是按相应标签组合来过滤出相关笔记对每个主题依次回顾。

整个过程是先确定回顾主题,然后快速获得每个主题积累的大概的经验信息,然后再深入细节,尤其对于一些有足够积累的领域去努力形成整体的知识。最后就是查缺补漏,顺便再整理一下笔记。

在这些主题里面,在管理方面,因为平时就注重随时的总结,已经形成一系列博客文章。形成了整体的知识和深层的理解。具体看个人中文博客:http://blog.sina.com.cn/happystone2009

而在技术方面,却是需要积累了足够的实践经验和重要信息片段(如带cheatsheet, tip标签的内容)后才合适进行整体的回顾,试图形成整体的理解。比如这次主要对git做了回顾总结,整理出一个大概的整体的知识,认识深度上也有很大的收获。详见:http://91biji.org/wiki/index.cgi/Git 另外,在shell方面也积累了足够的经验了,也该结集提炼出系统的知识出来了。

其他对osl发展, notebook的设计和开发这样的比较大的主题,不断组合出一组标签来侧重于某个方面进行回顾,来总结自己过去的工作,确定下个阶段发展的重点。另外对于产品设计,软件设计,旅游等比较小的专题也进行了回顾总结。

在回顾中的每条重要的感受和想法写也同样记录成便条,加上yearly review标签,供以后的反复回顾和参考。

用笔记本来对平时就随时抓取的学习瞬间(learning moment)的“重要体验”来进行比较长的一个时间段的回顾,是相当有效的学习方式。

一个是长期笔记记录,你可以注意到那些经常出现的东西,它们反映了那个时期的一个特征,能给你提供很好的反思基础;一个是过了很长时间后的回顾,没有了当时深在其中的某种情绪,可以更客观的审视当时自己的感受;一个是不同阶段的不同环境的比较,会有非常有意义的发现。

因为笔记准确的抓取当时的体验,并且客观的做了保留记录,你不需要在年底的时候凭借你的记忆效的来做模糊的有误差的回忆。并且所有的都已经形成文字可视化的呈现在你眼前,减轻了你的心智负担,避免一边要在大脑里缓存记忆,一边要对其做分析平衡和计算。

下面我就具体的对以上说到的四点,分别举几个例子:

第一个,对于长期里多次出现的,比如我发现有一个时期我的笔记里有很多关于人生的态度要像年轻的时候有那样的闯劲,继续乐观。这些出现的频率挺高,我意识到其实是有点人到中年在心境上有些变化,而这些笔记大概是意识到这些变化吧。

再举一个例子,我在回顾在现公司的管理方面的经验总结时,我发现所有的问题放在一起一看,很明显可以发现原因都是一个:组织太大了,造成了管理上的各个方面的困难。解决的办法:一个是把公司拆小,形成许多相对独立的小的个体,恢复类市场的机制;一个是利用web(互联网),把整个公司再变小。

关于第二点,比如通过各个公司的比较,其实各有各自的问题。似乎可以看开点,并且没有必要对自己当前的环境过于抱怨,把情绪化的东西去掉。

关于第三点,我在回顾时按照过去工作过的三个不同的公司来进行比较。按照在每个公司工作的时间段过滤提取出那个阶段的笔记。这些公司属于不同行业,管理文化,软件环境都很不一样,也是不同的公司规模。第一个最小,三十多人。第二个将近百人。第三个很大,十几万人。第一家是纯互联网行业,由美国硅谷回国创业者创办,在互联网界有一定知名度。第二第三家都是比较传统的公司,对于我来说,属于去帮助推进互联网的数字化进程吧。不同阶段的体验的集中碰撞出很多很有意义的发现。

比如我在浏览笔记的时候突然意识到第一家的管理和后两家的管理实际上是两个极端。第一家的氛围和美国公司很像,至少在氛围上还是相当平等互重的。员工,主管和老板之间都是名字相称。老板中午甚至非中午一样靠在椅子上打呼噜。公司的注册资料,财务资料等公开的放在柜子里不上锁。是相当的开放的文化了。但我个人认为问题是没有形成管理上的一定的信任层级。高管之间缺少创业团队的那种经常的正式非正式的交流和切磋。而很多重要的事情又一开始就放到整个公司层面去讨论。很多人其实还没有形成一定的能力时是不适宜揠苗助长的,对其成长并不利。而第二家第三家都有相当传统的上下级关系,各种总漫天飞,敬酒文化,吹捧文化非常重。而相应的在管理上的信任层级非常僵化,没有形成基于业务能力上的信任层级。

而我在浏览前面两个小公司的管理经验时,对比后面在大公司的管理上的感受,这个感受上的差异性,让我更理解小公司和大公司在管理上的深层次上的不同。比如在小公司比较容易形成主人翁意识,因为所有的事情都在你眼里。在大公司,即使本来主人翁精神很强的人,也很难形成主人翁精神,因为公司太大了,你看到的只能是很小的一部分。在小公司,对所有的一切都可以具体的感知,对管理很有具体的感觉。而对大公司就不那么容易把握了,很难去感受。当然意识到差别了,就会主动的去尝试把小公司里的主人翁精神带到大公司里去,以及如何利用web(互联网)把大公司再变小,让所有的事情发生在一个屋檐下面。这些对比帮助我思考把小公司里的管理体验如何运用到大公司的管理上。

还发现第二家公司和第三家公司一件很有意思的事情。虽然两家公司规模迥异,却在一点上非常相像。在第二家公司,由于老板是传统业界人士,不熟悉互联网,所以下面一堆高管忽悠老板。老板也对所有的人都抱着戒心,对谁都不信任。当然本身也没有认识人判断人的能力(我一直认为老板不懂业务问题不大,但一定要会看人。像刘备文不如诸葛亮徐庶庞统,武不如张飞关羽赵云,但是会看人懂得信任人)。而第三家公司因为员工数庞大,虽然老板和最高管理层相当优秀,但是最高管理层和基层之间隔了好几层,这些中层和基层的人就是基本上嘻嘻哈哈了。不是说他们不负责,不认真,但是工作文化在我看来是嘻嘻哈哈。为什么说嘻嘻哈哈,因为没有人真的当回事。缺少个体的兴趣就不会有真正的负责。

另外通过三个阶段的对比,可以发现比如哪些是职业发展中真正重要的机会,每个工作阶段技术长进的领域和程度,从而对自己的职业发展所需要的东西有个更清晰的认识。每个环境都给你不同的东西。如果你的目标是比较高的,你就需要去不断积累在不同方面的经验,需要结合自己当前的整体的情况,去最好的利用当前的环境,或者把握未来的机会。

我通过回顾后,会对每个阶段在各个领域的成长打分,最后算个总和,评估每一个阶段的成长值。比如下面这个便条:

2013,2014 achievement: tech 3; paas 3; inner source 3; profession of digitizing 3; travel 3; management:11; media and publishing industry: 1; translation industry:2; commerce: 4; medical 3; big company culture 2; SUM: 38.

这样通过时间段和相关标签的过滤,可以对每个阶段的某个侧面进行聚焦的回顾。通过笔记本来进行这样的回顾是非常有效的。其实我以前也经常做年度回顾,正是因为发现可以通过笔记本的方式让回顾更加高效的轻松的进行,才开发了笔记本。

记忆是不太可靠的。尤其是时间比较长的记忆。一般来说本周的事情你可能还是能够比较印象准确的,长了就有些模糊了甚至会有比较大的误差。这次回顾我就发现了好几次我的印象其实是不尽然的。幸亏通过当时的笔记,忠实的找回了正确的印象。

另外,我们在很久以前对自己的人生做的决定,当时一定还是有许多的考虑的。这么长的时间过去了,你也走过了这段路,你是否还记得当初的选择,是否仍然不忘初心?比如我在近两年前特别希望增加在商业和产品管理上的锻炼,以及带团队,积累公司管理的经验。如今回头看,我已经达到了目标,已经自信自己可以带好一个软件团队,甚至管理好一个上百人的公司。现在我觉得自己则更需要专注的是在实际的技术上继续再走深走广更多细节和更加过硬,在技术上基本达到自己当初开始时对自己的期许。不忘初心,清楚自己的成长,更明白下一步的方向。

此文献给跟我同样喜欢通过笔记方式来管理自己学习和知识的学友们,献给所有擅长反思喜欢学习的朋友。我们都是自学者,让自学更简单一些!

另外会写一文,介绍笔记本的统计发现功能,比如过去每年的统计结果,各个阶段的统计结果,该阶段的常用标签和新标签,每年的笔记数量重量平均值等的比较分析。

发表在 selflearning, 使用示例 | 一条评论

New features

We have a few new features released to help you better manage your daily learning:

Swapping of book:

If you go to a note list page, for example
http://3exps.org/social/leon/bookmarkbook/notes/?q=t%3Atip+%7C+t%3Acheatsheet+%26+t%3Agit&all=
, you can see on the right upper corner of the page, there is a dropdown list of book names in red font, you can try switching it to another book name such as note, you will be directed to
http://3exps.org/social/leon/notebook/notes/?q=t%3Atip+%7C+t%3Acheatsheet+%26+t%3Agit&all=
It will swap out the book name part of the url while keep the rest the same.
Screenshot available soon.

More date range filters:

First when in a note list page, press alt+p to open up the display filter. You will see that now you can view notes of last year. You can also view by a date range, by entering a request parameter in the url like this date_range=2014-08-20—2014-12-29. Date range filter is set for the session. So for all note list (snippets, bookmarks, scraps, frames, notes, personal or social) you will have this filter applied. To reset it, simply choose date range to all.

Clicking on desc to expand and collapse a note:

In a note list page, you can click on the desc (description) part (it is the second part. So it can be url part for bookmarks ) to expand the note. Clicking on it again will collapse it. For personal notebook, for now you can only expand it. For social and group notes, you can expand and collapse.

Support for passing page_size parameter:

In a note list page, you can pass the parameter page_size to change the default page size. The maximum you can set is 200. This is also stored per session. So you have this page size for all note list pages.

Fixed menu bar

In a note list page, the menu bar of the notes will become fixed to the screen when you scroll down enough. So it will be convenient for you to select some notes for bulk edition without having to scroll back to the very top.

Screenshot available soon.

Simple frame display:

For frames that has no child frame, we build a simplified template for displaying. So it looks better. For example, you can view this frame (in Chinese):http://3exps.org/social/leon/framebook/notes/note/9174/

发表在 新功能 | 留下评论

Inner Source Software Development Environment

Inner Source, basically is to bring Open Source inside a company. The Open Source software development platform and process allow programmers across the world to work on the same project at anytime, and produce very high quality software that is well documented. It is a higher standard of software development. This platform and process can be brought inside a company for members in a company to participate in software development process seamlessly. It is “Open” to all people inside a company.

  • Like open source software projects (for example Linus in Linux project, Guido in Python project), inner source respects project ownership as well, at the same time allows for very open discussions and inputs without losing efficiency. So every project will have an owner, whose role and responsibility is just like an open source project owner.
  • Flat learning curves for competent new developers. When new developers join, they don’t need to ask here and there to get to know all the resources. The environment should be built up to allow new developers to start contribute to the projects soon, just like in open source projects.
  • Programmers participate in a project just like how they participate in an open source project: normally they start from debugging or working on TODOs inside the code, and submit pull requests. And they move up the ranks by making contribution and demonstrating skills.
  • New official projects will be listed under new projects page. These new projects need to be “owned”. Programmers can apply to own these projects.
    Programmers can start their own projects as well in company code platform (github currently). However, these projects have to demonstrate its usefulness and quality to be recognized as “official” projects.
  • Programmers’ work and contribution will be evaluated based on the official projects that programmers work on. The evaluation will be based on professional experience and judgement instead of superficial numbers. After all, software process is a complex process. Numbers will be used to help analysis.
  • There is no boundary of programming and programmers. There are certain percentage of tasks that will be assigned and arranged by team leaders. Additionally, programmers can work on any project that they are interested and feel they can make a contribution. So devops people, QA people can work on programming projects as well. Non tech team members can also work on programming projects. But the acceptance of pull request will be the right of the project owner.
  • With official and unofficial projects, we intend to build up a rich environment with many projects that people can participate in and learn various programming skills step by step. All projects are following the open source standard, with flat learning curve and easy to participate and contribute. Thus a learning environment for software programming will be built up, which will be essential for us building up a strong software team.
发表在 Software | 留下评论

我是如何学习git的–谈谈互联网时代的学习方式

我是10年初开始和朋友一起做一个项目的时候开始使用git来作为我们的代码仓库进行远程合作的。当时主要是先看了一下维基百科等了解了一下基本的概念,和svn的区别等。记得当时joelonsoftware刚好有些文章介绍git这样的分布式的代码仓库,Joel当时也是刚开始学习了解Git,Mercurial这样的分布式代码仓库,写了些文章。一开始因为要在自己的vps上建git bare仓库作为合作的主仓库,朋友在git方面比较有经验,跟他了解了一下使用git的合作编程的常用的流程。在自己服务器上搭了个git bare仓库。后来又在github和bitbucket上有更多的基于git基础上团队协作,不断积累自己对git的理解和实际操作经验。实际经验积累的比较多了以后,发现有一些写的比较好的能够清晰掌握git概念模型的文章如阮一峰写的几篇,再找出自己多年的笔记,做了个整体的总结,算是把git的比较清晰的概念模型建立起来了。

整个学习掌握git的过程,我没有去上什么培训班,没有专门找什么老师来教我,也没有去找什么所谓的教科书,甚至没有怎么专门的学习git。除了一开始大概集中看了下git的基本概念和介绍,和最后做了个整体的回顾总结,从没有花大块的时间专门去学git,都是在实际工作过程中逐渐的积累自己的经验和理解。

试想如果还是以传统的学校课堂的方式去学习,要等到什么时候才会有git的标准教材出来?等到有git的标准教材出来,有git课堂出来,恐怕也是git快过时的时候了,就好像以前我们在学校里总是在学习已经过时的东西一样。其实即使有了标准的教科书了,教你的老师就一定有大量的实际经验吗?缺乏大量的实际经验的“老师”,真的理解他所教的内容吗?大量的技术的涌现,你在学习这些新的技术的时候,还没有教科书,你如何学习?很多人脱离了学校学习环境后面对生活中需要学习的大量的知识,似乎总是手足无措,要回到学校课堂式的那种学习才感觉好像抓住了一根拐杖似的。

这里我试着以学习git为例,试着跟大家探索自学的方式。其实我相信很多人在学习这些新技术时,都大致采取类似的方式,不管是有意识还是无意识。但我想通过学习git这个具体的例子,展示一下这个自学过程的最基本的一些步骤,并对其过程从几个方面做个分析,帮助大家形成对于自学的更为理性的认识和理解,可以在以后的学习中更系统有效的运用这些方法。

首先是通过维基百科或者官方网站这样的站点区获得初步的概念和理解。这里如果是在学习自己感兴趣领域的人,基本上很快就能领会基本的概念是怎么回事,就可以通过动手实践去积累具体的经验了。

我们知道文字阅读是比较消耗时间的。很多时候我们读了大段的文字,还是不清楚作者所指。这对作者的文字表达其实是有比较高的要求的。如果初期发现的材料质量不高(对于比较新的技术,这是经常会碰到的事情),那么与其花太多的时间阅读材料,不如尽早的去接触实物去实际操作,可以省去很多的时间。这时一般都是找些很快就能够上手的实例或者项目,完成一些简单的操作,对一些基本的概念建立起感性认识。比如git是分布式的代码仓库。对这个分布式的理解,可以很快的通过一些具体的操作获得真实的感受。这样的感性的经验是需要你在实践中去不断积累的。而你要获得对于某个领域的知识的理解,你就需要从多个方面多个层次去不断积累感性的经验。

通过网上查询或者参与网上社区,基本就可以找到当前比较好的学习资料。这些好的学习资料,恐怕很多学校里的老师都不知晓。如果是比较新的技术,暂时还缺乏好的文档或者教程,也没有关系,并不阻碍自己的不断学习进步。在实际工作中不断的解决问题,不断从网上找到片段式的好的信息或者答案(比如stackoverflow就是编程领域一个很好的资源,只要查到的是stackoverflow上的信息,尤其是很多人点赞的,应该是相当不错的资源)。

实际经验和好的资料积累到一定阶段,就可以进行整体的回顾和总结。可以自己快速的提炼出整体的知识。积累到什么程度时可以进行整体的回顾和总结了,你是可以感觉得到的。在那个时候,只要投入不多的时间做个回顾,你就可以获得整体上的理解,靠这个整体的理解和融会贯通,你不再需要更多的记忆就可以快速的运用知识在各种场合里。

在整个过程中,如果我需要弄清楚某一个概念,我就去找概念性的资源。如果我需要更多的实践,我就在实践中去积累。这是很灵活的学习,不浪费时间的学习。所以这里对自我的感觉是至关重要的。我们必须能够清楚的感知自己是处在哪一个学习的阶段,在每一个阶段需要什么样的知识,是概念性的还是实践性的感性的知识。什么时候需要通过比较长的时间去点滴的积累,什么时候需要在短时间内大量的投入快速取得整体的突破。并且知道在互联网上哪里有你需要的合适的资源。比如知道维基百科可以是很可靠的基本概念的资源。Stackoverflow是获得具体的点滴的实践知识的优秀的资源。互联网已经提供了比较快的获得各种资源的方式,如果可以很好的自我感知,就可以快速灵活恰当的去利用互联网的资源,快速的学习。

这样的学习方式,依靠自己的感知,利用丰富的互联网资源进行快速高效自由的学习。

最后自己总结出来的知识,包括那些在学习过程中收集的好的资料和信息以及多个层面多个角度的理解,是可以和大家进行分享的。如果有好的分享这些整理过的来自学习实践的活的知识的社区,那又成为其他学习者的可以利用的优秀的学习资源。并且这样的知识是活的知识,是随着人们的学习进展和不断的贡献得到不断的更新不断改进提高的知识,而不像传统的教材,难以更新或者更新极慢。同时这样的知识是立体的,可以有丰富的示例,项目,问题,博客,视频等等(比如这个学习领域软件编程或者关于教育)。

上面总结的这个基于兴趣的自学,大家可以看到其实是非常简单的。其要点主要是基于兴趣,在生活和工作中不断积累,感知,和积累到一定阶段后的总结。很多人总是感觉脱离学校后的自学很茫然无从下手,其实只是因为学校学习带给人们的错误学习观念太深了,一旦脱离就感觉诚惶诚恐失去依靠。我们需要不断通过自学实践去摆脱那些错误的学习观念,恢复自己其实在孩童时期就有的天然的学习能力。大家需要明确的知道:基于兴趣的自学才是真正的学习!抓住以上的要点,如果再有好的网络工具,帮助大家在生活工作中及时收集积累好的资料和个人领悟,人们可以很方便的进行基于兴趣的自学。

下面我们来看看,和传统的学校学习比较,这样的基于兴趣的自学除了兴趣驱动外,有什么特征。

第一:逐层次逐点的学习

从来不需要传统学校学习那样的大块的专门时间的学习。任何学科,都可以逐层次的逐个点的慢慢的积累,这样就可以时刻和实践结合,利用互联网,不断的去积累。不光传统学校那样呆在一个封闭的环境里连续学习十几年是完全没有必要的,就是连续学习一年甚至一个月都是没有必要的。最多几天(比如学习生物),就应该可以完成一个层次的学习。

利用互联网进行逐层逐点的学习,需要注意对所找到的材料的价值的判断。如果当前找到的资料比较费解,花很长的时间所获得的收获也很少,那很可能是资料的质量不太高。那就大胆的先放着。尤其当你可以通过实践去增进对其的理解的,或者你暂时的工作并不需要对其的大量的运用和深度的掌握的时候。(这些应该是绝大多数的情况。)你是有着多种的方式去增进你对该领域知识的理解的,并不是一定要专攻教科书,毕其功于一役。很多时候,你甚至是依靠在比较长的时间段里的偶尔冒出的灵感或领悟来不断增进你的理解。

其实在我学习git的过程中,早就发现网上有免费的git书,但当时觉得质量不够好,至少阅读比较费时间,涉及的细节太多。所以只是暂时收藏了放着,等到以后需要的时候才去具体的阅读。很多资料都是这样的,碰到了但是暂时不太适合你当前的知识程度,就可以先收集起来,标注一下,等到以后需要的时候再去集中阅读。

对于git的学习,我自然不敢说我现在就全部学透彻了。要学透彻了,恐怕就要看源码了。以我以前做过硬件的经验来看,只有到硬件那个层面,才算真的清楚什么是什么。但是即使不算对git的知识全部透彻了,我想这样的知识状态并没有什么问题。知道自己哪些还不清楚,时刻等待着机会能够去更深入的了解,而不用受限于传统学校教育的观念,似乎学习就必须一次打破砂锅问到底,追根问底才行。其实以我们的现在的科学知识所达到的深度,难道就已经对这个世界知根知底了吗?在新的实践中,我们会不断发现过去理论的局限性,发现必须在更深的层面去重新认识和理解。所以,大家在学习中就放心的浅尝则止,不求甚解吧。暂时放下书本是没有关系的,人的认识一定是要和实践结合的,根据实践的经验去反思总结来逐步增加自己对世界的认识。其实我们个人对所处社会和文化的认识,不也是在大量实际经验的基础上进行反思总结的结果吗?

更何况人的一生需要学习的东西很多,你完全应该根据自己当前的兴趣和需求等去感觉要在当前的这个知识领域深入多少。自学的关键就是要去把握当前自己的学习需求和相关理解力跟当前资源或项目之间平衡。比如说软件编程就是一个很大的学习领域,过去我根据自己的兴趣主要专注的在软件工程,对象化编程,数据库设计等方面,对算法和性能相对关注的比较少。但近几年,随着在软件工程等领域的知识的逐渐成熟,自然更多的开始关心算法和性能等方面。但是我其他一些朋友,可能从一开始就更关注在算法和性能方面。如果你喜欢某一个领域,希望自己在这个领域能够有杰出的能力,你必然需要学习很多的东西。如何结合自己的兴趣和实际的境遇去平衡自己的学习,逐层的推进自己的知识和技能,就是你所需要的重要的能力。

第二:时刻与实践的结合。

当然也正是因为可以逐层逐点的学习,才有可能时刻不脱离实践。对事物形成理解力是很重要的。学习就是去建立那种理解力。要形成理解力,你就需要足够的空间和时间。需要大量的实践去获得感性的体验和认识。需要在一段比较长的时间里去从各个层面各个角度去丰富你对这个领域的理解。需要不断的回到这个知识领域。这些,只有在生活中的自学才能够帮你做到。

因为时刻与实践的结合跟上面的逐层次逐点的学习是相辅相成的,我们这里不再多讲。

需要说明的是我们并不是要完全否定学校学习的方式,我们只是在找各种情况下的最快的达到学习目的的方法。当然学校学习过于僵化,并且在绝大多数情况下是极其浪费时间的学习方式。更大的问题是这种僵化的学习方式往往变成人们观念里的唯一的学习方式,而使人丧生了自我感知的能力,这直接导致人们学习能力的丧失。

当然取决于你的能力和实际的情况,你可能会一上来就花很多时间把git完全搞清楚。如果你觉得那样你学得更快,没有问题。如上所述,我们并不是要否定其他的学习方式,只是说大家应该清楚其它的选择,以及知道何时应该用其他的方法更快速的前进。只要不是只有一种学习方法,只要你能够基于兴趣去学习,不断的去感知,去利用各种资源快速的学习,那就是好的。

我想澄清这些后,大家可以摆脱传统学校学习观念的束缚,认识到其实平时在使用的自学的方式就是真正的学习,即使自己以前只是潜意识的松散的(甚至抱着负疚感的,好像自己不是在真正学习一样)在运用,从而开始真正自由的学习。

以上讲的还只是对于一个具体的技术的学习。这些对于很多程序员来说,因为他们平时需要大量的学习新的知识,所以多少都会有些自学的经验。另外,对于学习敏捷编程这样的比较大块的东西,实际上也是完全可以通过互联网来自学的。

我在2003年读研究生上软件工程这门课的时候,当时的教材主要介绍的还是CMMI类的软件工程方法,因为我对软件工程很感兴趣,就在网上自己找相关的资料信息,接触到了敏捷编程。那时候敏捷编程刚提出来没有几年,许多人都不知道。但是通过我的查询阅读,以及不断的扩展性查询相关的知识,不光对敏捷编程运动里的人物和他们的许多文章有阅读,还把interactive computing, Christopher Alexander等都挖出来了,是个不断思考不断阅读的过程,对敏捷编程发展的整体的状况,背景,来源,具体实践等等都弄得比较清楚,结合自己长期对软件的兴趣去思考,自然能够比较深的理解其本质的含义。此后多年来在软件工程领域的实践,经历了各种不同的项目和不同的软件环境,在十多年的时间里把自己对于敏捷编程的原则和具体实施有了很深的理解有全面的把握和整体的感觉。而且这些学习,实际上是跟我对软件本质的兴趣是一致的,是和更广阔的人文学习不可分割的,甚至是和管理的经验息息相关的。缺乏这些方面的兴趣,是很难深入的理解敏捷编程的。

这里重复一下,敏捷编程的学习,我没有上任何敏捷编程的课,没有接受任何敏捷编程的培训,完全是通过互联网上的学习和实际工作的积累,不断的感觉和总结,才形成了自己的知识。我相信自己在敏捷编程方面的知识可以超过任何一个敏捷培训师。最后加上这句不是为了自夸,而是为了说明基于兴趣的自学才是真正的学习之道。而互联网资源的丰富,已经使得这种基于兴趣的自学可以自由自然的开展。在不久的未来,这也必然成为大众主流的学习方式。

同时大家也可以从敏捷编程的学习看到,一个知识领域是跟其他相当广泛的领域的知识和理解相关的。缺乏其他领域的广泛学习,敏捷也是无法去深入的。传统的学校学习是无法囊括这样的学习的。但是互联网时代的学习可以为这样的学习提供合适的工具,让其显现出来。

为了帮助大家更好的看清楚过去和未来之间的联系,我们可以再比较一下这种基于兴趣的自学和传统学校式学习的区别。我们看到基于兴趣的自学基本上是一种连续性的学习,而传统学校式学习有着严重的断裂,太多的我们过去学习的东西已经接不上了。比如我们在学校里花费这么多时间学习的教科书上的内容,都已经尘封在久远的记忆里去了。我现在仍然在生活中学习许多的医学知识,过去大学里学习的很多生物的知识能够起到一个很好的底子,我也经常上网去查找某器官或者组织的解剖图或者比较底层的系统的知识来帮助自己对实践中积累的知识有更好的理解。不过目前的互联网数字化进程的程度,还不能找到生物方面比较丰富的数字化的内容. 而要去找以前的教材已经是不太可能或者过于麻烦了。但我相信随着数字化进程的深入,不久一定会有很多更好的系统的生物知识(可以是图片甚至三维动画)在网上可以很快的找到。每个人需要的时候就可以找到某一张解剖图或某一个层面的系统知识进行学习,结合自己的实践经验形成自己的对于整体知识的理解。也就是说即使对于生物或者医学这样的领域知识,也是可以利用互联网结合自己的生活来进行逐层次逐点的学习。

所以我相信,未来一定是这样的学习。旧的基于学校课堂的学习模式早已经不适用于我们这个时代了。大量新知识的涌现,呼唤新的学习方式。大家只要广泛的参与到自学中去,不断总结自己的经验,并设计相应的软件工具帮助自己和他人的自学,我们就可以逐渐的创造出未来的主流的学习方式。

希望在以后大家想要学习某个知识时,不是首先想到去进什么学校,上什么课,或者找某某老师来讲学。而是首先动起手来,找到合适的资源和项目,开始在这个领域的知识积累。

附上git学习的WikiNotehttp://91biji.org/wiki/index.cgi/Git

发表在 selflearning, 演讲, 使用示例 | 留下评论