初学者如何通过技术社区加速成长?
两年前开始, 持续至今的一个话题.
from: Zoom.Quiet <zoom.quiet@gmail.com> to: CPyUG~华蠎用户组 <python-cn@googlegroups.com> date: Fri, Jan 23, 2015 at 11:40 PM subject: [101] 新人到底需要什么? 俺以为现在 Python 的中文资料/图书 极大丰富的情况下, 入门已经不是问题了,,,,要不怎么 CPyUG 列表越来越不活跃了呢?! 但是,几乎每周,俺都能从各种渠道收到类似的求助:''' ...我是一名学习python的初学者,并且没有任何基础, 我现在学习陷入了困难,希望找一名老师帮助我,十分感谢.. 所以, 俺想这里是真的哪里有不对, 但是, 俺真心不知道90后新人, 心目中,老师可以给予的具体帮助是什么 大家是否能共同给出一个永久性解决 "不知道如何自学/开始学习 Python" 类似的入门求助问题解答?
故事
无意间发起的讨论, 自己也没想到持续了这么长时间, 看起来, 只要列表存在, 随时可能有人挖坟重启讨论,
因为, 这是个有长久意义的基础命题:
如何在任何一个领域 通过社区 获得高速成长?
先回顾一下讨论的进展:
- 15年1月, 触发
- 半年期间, 完成100+ 回复
- 从学习资料的选择
- 到自学路径的推荐
- 又拓展为社区平台的对比,再组织
- 进一步延伸到自学姿势和体验
- 引发一系列断言
- 慢慢,大家感觉这个命题太模糊, 又持续的进行范畴的精简...
- 一年后基本停止讨论,大家各自回到自己的学习桟突进了
- 今年, 当年的小白, 现在的老司机: khsing
- 又在四月重新回应
- 引发又一轮反省
- 而这两年, 又正好是俺自己工作场景 pivot 的阶段
- 从 15+年, 持续工作中
- 进入到更加高速的创业全桟工作
- 从公司岗位协同, 变成 SOHO 独自工作
- 不过,社区的参与从来没有停止过
所以, 作为被公认的社区 大妈
从多年亲身体验中,
总结一些 自学+社区
的经验,应该能帮助那些刚刚接触到技术社区这一生态的上进者们.
新人
~ 先明确一下界限
论述开始前, 当然得先明确探讨对象的界定, 否则随时可能陷入鳮同鸭讲的囧态中.
在讨论过程中, 大家对 新人
的共识是:
- 纯新:
- 对于编程,负基础
- 过往人生/学历/技能/... 和计算机没一毛銭关系
- 但是,突然无论什么原因, 要开始编程了
- 一冒头, 就被海量的概念和选择击晕
- 半新:
- 有一定编程基础, 知道一些基础概念
- 可能学校中教过, 但是,当时没有学进去
- 现在, 工作/任务需要真正开始编程解决具体问题
- 通过朋友/网络推荐,选择了 Python
- 老新:
- 职业程序猿, 以往用 PHP/JAVA/C/C++/... 主流语言
- 突然岗位/系统/任务相关, 要求快速掌握 Python 来解决具体工程问题
那么,对技术社区而言:
- 老新, 只要用对资料, 快速将以往经验迁移到新的语言平台上就完成自学, 不用社区协助什么
- 半新, 很容易成长为社区的中坚力量
- 因为多数是因为兴趣主动选择这一技术, 又有足够的耐心和经验来自学
- 对社区的知识积累能很快进入角色
- 而且能快速结识水平接近的同侪, 形成小团队相互促进自学
- 纯新, 对社区而言, 也很珍贵,因为是对社区积累的资源体系的一次次活体检验:
- 简单的说, 一个技术社区成长的是否快速, 影响力是否能高速积累
- 关键考验的, 就是纯小白用户, 路转粉的速率
那么对于原始命题: 新人到底需要什么?
这其中的 新人
就应该限定为:
无基础的初学者
究竟什么是基础?
那接下来的问题就是:
对于编程 究竟应该有什么基础?
在列表线索讨论中,大家给出了一系列悲伤的故事, 经典的有代表性的:
91年的堂弟, 中专电子专业文凭, 突然来深圳找工作, 性格内向,期望找酒店服务生之类,考虑到他一只腿有点瘸,走起路来不方便, 所以推荐他去学电脑/前端之类的.
他选择了学习PHP, 帮他找了PHP培训机构. 4个多月培训出来之后还是找不到工作,都嫌弃他没经验或者面试就直接没通过.
只能边找工作边辅导教他学习 Linux 及 VIM, 能照着文档把 LNMP 顺利编译完成 (两个星期才全部弄好,一有编译问题就等着, 直到下班问他有没有问题, 他才说有问题,结果都是些一google就能找到方法的问题)
之前就跟他说过有问题直接在QQ上问, 然尔一次也没有QQ上问过.
而且, 只是把自己在学校练习的PHP项目放进本地 LINUX 中 PHP 环境一跑就报错, 每天我下班回来问他搞好了没?
他回:"还没有,遇到了点问题"; 我说:"你自己google解决吧" (翻墙是我教他的)
过了三天,还是没有动静, 周末我这个没学过 PHP 的运维帮他调试了下, 马上定位问题所在:原来他代码里引用的其它文件使用了绝对路径!
觉得这样的问题都解决不了真的是太让人绝望了, 在培训学校的时候这样的问题应该有遇到过, 或者应该有能力去排查掉这样问题.
期间我告诉他你在这里住好吃好, 边找工作边自己学习, 不用着急想着赚钱, 你要是实在找不到,就去找能给实习工作的公司也行.
结果这周自己不先打个招呼走了,后来电话告诉我自己去龙岗那边找工厂上班...
总的来说:
- 自己不想学习,不感兴趣
- 你再努力教他也白搭
- 自己的未来只能自己把握
当然, 也有正面的案例:
还在大学的时候, 曾经参与了FFVII的汉化, 其中有一项重要的工作:
- 需要对FFVII的可执行文件进行patch
- 加载汉化后的字库
这项工作是由一位之前没接触过编程的朋友完成的.
他因为太想完成汉化这件事, 自学了汇编以及程序调试相关的知识, 花了相当长的时间最终独立完成了这项工作!
这个案例说明了当你有一个迫切想解决的问题, 你会用尽一切办法去学习相关知识, 而这种学习往往是提升最大的.
进一步的, 所有标准的: 不折腾会死星人
在独立熬过入门阶段后,
最怨念的是: "...想去搜搜看却连应该搜什么都不知道"
- 这才是最核心的基础能力要求了
- 参考: 如何提问?才对世界有帮助!
笑来老师曰过:
初级知识 需要对高级知识深入了解 才能真正深入了解
- 所以,传统学校里那种一开始就给你一个领域知识的全貌
- 然后按照不知所谓的顺序塞给你的学习流程
- 从本质上是错误的
- 以俺折腾各种技术的体验来看:
- 以实际问题为切入
- 以过往经验为支撑
- 在持续的问题解决中修正对新领域技术的宏观理解
- 从而逐步找到兼容自个儿以往经验的通用解决思路
- 进而形成吻合自个儿工作域的资料组织/积累方法
- 最终,可以自如的运用新技术解决常见问题
- 就象 CS 一样,要大胆的放侦察兵, 死一批后,就自然知道怎么打了
- 而妄图有个清晰的, 一目了解的地图给你来作弊, 是不现实的
- 因为, 别人的清晰图景不等于是你的
- 更因为, 可用的地图,必须用自己的内部库关联编译才用的了的
- 否则只是一个无法索引的大数据集而已
- 根本无法根据具体问题自动组合调用
所以,现在可以基本明确:
- 要进入自学的正循环
- 必要基础是:
- 自我管理
- 提问
那么最初问题可以推进到:
如何回答新人们 经典的入门问题?
入门?!
引用列表中的有关回答:
- 心目中的
入门
的标准 - 所谓入门:
- 其实就是说你面对一个具体的问题的时候
- 首先知道它是不是超出了自己的能力
- 如果你相信自己能解决,那么能大致勾画出解决的路径, 列的出必要预备知识
- 如果有缺失的知识, 你也知道该从哪里入手开始学习, 需要学到什么程度
嗯哼?!
这个入门的指标, 在多数新人眼中, 已经是专家级别了吧...
真正的需要
还得引用讨论中的经典嗯哼:
- 21天精通其实没说错
- 只是有些东西没说 --- 那是针对已经有经验的程序员的,不是你的
- 好比 "30分钟搞懂正则表达式"
- 对大部分有字符处理经验的程序员来说,不太难;
- 如果还有编译原理基础,30分钟甚至可以学到开始写一个简单的正则处理库的原型
- 但是在学习正则表达式前
- 你需要首先明白什么是字符串,什么叫转义
- 字符串有哪些处理手段, 我们常规需要对字符串做些什么...
- 同样,大部分时候,我们并不是在学习python
- 如果python这么复杂,很多公司根本不会去用它,
- 我们常见的问题是:
- 一个程序员用python写了一个程序
- 从一个文件里读取数据/处理/然后输出回原始文件
- 突然有一天不工作了
- 老程序员看了一眼
- 文件里带了中文
- 输入输出的时候没考虑编码问题
- 但是新手说——python里没教过这个
- 这从来不是python应该教的问题
- 这也不是任何一门语言应该教的问题
开始学习
是的, 一切新人式问题的根源只是因为并没有开始学习,
而是, 依然在传统学校灌输式被学习
的心理依赖状态中,
等待被灌输...
问题在,计算机编程, 是门手艺活:
- 如同游泳一般, 算是肌肉技能
- 记忆再多的游泳技术和比赛技巧
- 但是,不下水练习, 转化为肌肉的自然反应
- 那么, 永远只有被呛住的结果
学习, 本身就包含了学和习两种行为
- 而且,练习可能比学问, 还要重要
- 因为,只有通过练习才可能明确自己掌握的是否对
- 编程其实比其它领域学习,更加容易的一个原因在:
- 练习的结果是不用问其它人
- 通过编译器的实时反馈就可以自行确认对错的
即,在编程领域中的学习, 能比其它领域建立起来更快的 MVP
- Minimum Validation Process
- 最小有效过程
社区
~ 是的, 社区是建立这一过程的最快场景
讨论中最重量级的断言是:
from: Shell Xu via googlegroups.com reply-to: python-cn@googlegroups.com date: Sun, Oct 18, 2015 at 11:06 AM
你可以教授所有东西,但是唯有求知欲和学习能力除外。
大家表示同意:
- 觉得任何一个合格的程序员都要经过:
- 发现问题 -> 理解问题 -> 解决问题 -> 总结问题
- 这个过程的洗礼
- 在不断挑战自己面对一个个的问题过程中
- 编程的能力才能得到提升
- 我们也许可以对解决问题这个环节提供帮助
- 但是整个过程本身是无法教授的,需要靠自身的努力来完成...
不过,最后阶段反转性断言,指出了社区存在的意义:
date: Tue, Mar 21, 2017 at 8:27 PM
庄表伟:
求知欲不能教授 但可传染 学习能力无从教 却能修炼
无法同意更多:
- 基于外部动机的学习,都是短暂性的行为;当外部动机消失时,人们无法保持学习习惯;
- 当学习的目的是为了找到工作,找到工作之后人们就会停止学习
- 人们如果没有继续学习,当工作发生变化,人们将无法胜任
- 人们为了再次胜任工作, 被迫重新开始学习
- 这样的外在动机驱动的学习,造成学习者无法建立持续性的学习习惯,形成知识/技能/心智等层面的持续积累
- 当学习本身成为一种快乐,成为满足好奇心/满足求知欲时,才会在个人的生活中随时/随地自然发生
- 学习本身成为一种成就,就会更为客观/不受产业诱导的影响
- 帮助学习者更独立地分辨真正的知识和伪装的知识
技术社区,可以说, 本身就是由成功的自学者们组成的, 乐于分享自学成果,前提是问对问题:
- 是的,参考: 提问的智慧
- 这一古老的文章包含了技术社区几乎所有的秘密:
- 为什么新人容易受到嗯哼
- 为什么技术社区如此不友好
- ...
以及大家可能都没有意识到:
- 会问问题本身,就是一种指标
- 标志着已经学会了目标领域的关键知识点
引用讨论中的经典断言:
其实 "开发语言" 真是很好的命名 编程这东西就像学外语一样 突然有一天 当你发现自己居然可以自由运用了 那么你就会说这门语言了 计算机理解你写的代码了
综上
初学者如何通过技术社区加速成长?
这个命题其实有一系列背景问题:
- 什么是初学者?
- 初学者应该有的能力是什么?
- 什么是社区?
- 什么是技术社区?
- 技术社区的运行机制?
- 为什么基于技术社区的自学能有效加速自我成长?
- 怎么检验成长速度?
- ...
逐一展开, 不知道要写多少字了;
先说这些, 在语音分享过程中, 我们再看能挖掘出什么有趣的问题, 引发下一期 GitChat 吧.
后记
这个分享应该算 CPyUG
的集体创作, 在 28个月的列表讨论期间, 贡献过意见的 Pythonista 部分名单:
Glowin 风间星魂 shichen shell909090 XO y 悔恨的阿毛 bosby j yourzhaozhao 牛魔王 yegle Adieu feiandxs ubunoon Leo Xu qyb Elias Soong balckwing laike9m Jex fy0748 Pengfei shhgs whycrying Rongxing khsing ...
QA
作为一个半新人,我的困惑如下: 公司平时任务很多,所以深入学习技术的时间少。 每次碰到一个知识点,看源码看文档,刚要接近真相的时候,突然意识到任务为重, 然后就把这个知识点暂时放下了,导致积累了很多要学的知识。 这令我很困惑,我该如何去权衡这两者之间的关系呢?谢谢
这其实是个个人技术债务的管理过程:
- 那些知识点间的关系如何? 是否有内在关联性? 通过哪个知识点的突破就可以批量突破?
- 以及和公司技术债务类似, 都只能在行进中挤时间来弥补:
- 深入到什么地步可以收手?
- 或是说, 是否要完成学习的全部?
- 俺的习惯是, 遇到新知识点时:
- 先完成任务相关的
- 同时用最小时间将关联的所有能找到的文章收集整理下来
- 挤时间通读,形成整体印象
- 但是,不进行具体的实操和检验
- 下次, 再遇到相似问题时,就有一个基础
- 再进一步挖掘一下
- 即: 将一次性知识点的吃透,变成多次任务驱动式的资料收集和分阶段实操
- 以及更加关键的, 持续输出
- 将过程中所有已知/未知以及技术点的关系逐步记述/分享出来
- 慢慢的,新领域的各种坑都踩过了, 也就不知不觉的上了手
- 这其中, 可能更加困难的反而是心态的管理
- 不急不燥, 保持好奇心以及简洁的持续输出
Author: /mail / gittip / github