从P1到P7——第八年

原文发布于201314

2013年的第一场雪,来的比以往更早一些。昨天下了一天(2013.1.3),今天我就知道没法开车上班了,于是去等公交车,等了半个小时挤不上去,然后我就打算徒步去上班,想着8公里路跟爬珠峰差不多了,试试。但走了两公里之后,我就走不动了,于是遛进路边的星巴克,打开电脑,开始装13。领导在网络那头说要写一下去年的总结,我就好好总结一下吧。

  这一年可以用百转千回来形容,在阿里巴巴,你永远无法预料下个季度你在做什么。2011年淘宝网一拆四,变成了淘宝、天猫、一淘和聚划算,我变成了阿里巴巴集团的人,从业务部门变成了HR2012年初,马总提出了“one company”的概念,要把集团内资源打通,很多老板来回转岗,很多业务也统一整合,于是我的老板换了,老板的老板也换成了HR的副总裁。但老板上任之后刚刚请我们吃了一顿饭,就又换了一个老板,新老板带我们吃了一顿饭之后,又吃了一顿,又吃了一顿……又吃了很多顿之后,总算不换了。新新老板是一个有策略的人,他不像多数新老板一样先来三把火,而是三个月内不点任何火,只是不停的带我们吃饭,观察我们做事的状况。

  在这样的状况下,其实我们自己也在不断的寻求变化,本来技术大学、运营大学、产品大学刚合并没多久,我们也经常相互切磋学习方式的创新。我们认为线下培训的方式只是我们的第一版产品,随着公司规模的扩大、办公地点的继续分散,这个成本会越来越高,最经典的是在每年七八月份的时候,能够顶着烈日走到一千米外的另一幢楼里上课都需要很大的勇气。还有一个问题是随着业务的拆拆合合,每个业务对培训的需求是不一样的,统一集团层面的线下培训无法满足小团队自身业务的学习需求。

  那我们的2.0版本的产品应该是什么呢?我们认为应该是在线学习,在线学习是一个说起来简单,做起来很有难度的事情,在线学习大概有4种模式:视频、文档、直播、问答。视频要解决一个拍摄的清晰度和声音的纯净度的问题,在一般的教室里面拍摄的视频,投影幕布很亮,人物黑乎乎的,窗外的汽车喇叭声鸟叫声很嘈杂,要是讲师在白板上写几个字,镜头还需要移动拉伸,这对器材、环境和摄影师的要求都很高。我们和集团橙色天空团队合作,借用他们的器材,学习他们的拍摄技术,现在拍摄的视频效果已经超越家用DV了,呵呵。在线文档的难度不在于产生内容,而在于内容的吸引力,PPT很难承载有实质内容的东西,PDF太长的话又没有人看。视频直播我们和淘花网合作,用在线 flash 播放的技术,这个相对而言比较成熟,但也受限于摄影机、教室环境这些硬件因素。问答是我们模仿知乎的作品,通过学员主动提问,邀请同事回答的方式来营造一个学习社区,这个的难度主要是早期种子用户的培养和优质内容的推送。

  虽然困难重重,但大家取得一致认可之后,我们就开始推动这些事情了。培训管理员小姑娘开始学习操作专业的摄影机,拍摄完毕还要做视频编辑,投入了非常大的精力。上半年就上传了50多门课程视频(基本上拍摄和制作一部视频至少需要两天的时间)。在线文档模块,我们有集团内最活跃的知识管理狂热分子,他一个人就上传了几千份文档。视频直播主要还处于试用的阶段,在重要的课程上,我们开通了所有员工可以在线观看的直播通道,这些重要的课程包括正祥、毕玄、褚霸等人的最新研究。问答频道在问题少女小组的运营下,也出现了不少优质内容,还有元芳你怎么看等颇具社区氛围的东东。

  这些新的学习方式的探索是一个长期的过程,搭建一个平台很容易,上传很多内容也不难,最重要的是坚持维护里面的内容,及时更新有效信息,我相信只要保持这种热情和精力的投入,在线学习的平台未来能够发挥出比线下培训更大的作用。说到这里,顺便提一个概念——知识管理,我不太认同这个概念,在传统行业,知识或许可以管理,但在互联网企业里面,知识的更新迭代非常频繁,等你理出来刚要管的时候,它已经失效了。我认为互联网行业的知识不是要去管理的,而是要让隐性的知识显性化,在它的生命周期里迅速传播出去。我们不需要等它沉淀,只需要让足够多的知识流动起来,就能创造巨大的价值。

  老板一边和我们探讨新的学习方式,一边开始响应“one company”的号召,打通集团内部的培训业务,我们团队的三个大学出自于淘宝网,另外B2B和支付宝也都有百年技术大学,在技术大学下面也有应届生培训、在职培训等多个产品。我们这些大学之间有些民间的沟通,但从来没有打通过资源,也没有共用过一个平台,可以说是各自为战,现在都“one company”了,自然也要打通一下。于是在老板来了三个月后,我们启动了一个小三通和一个大三通项目,小三通就是培训资源的打通,包括课程、讲师、解决方案的互通有无;大三通是培训平台的打通,培训的资源放进同一个平台里面。我任小三通项目的PM、苏苏(就是《人人都是产品经理》的作者苏杰)任大三通项目的PM

  于是在这个春夏之交的时节,我们两岸三地(钱塘江两岸、B2B/支付宝/淘宝三地)的培训人员开始了三通的工作,记不得开了多少轮的会议,在即将结束的时候,变化又来了——620B2B退市,分拆成CBUICBU,原B2B的技术大学并入集团,于是从组织结构上直接就过来了,人都在一起了。

在一起之后,就到了火热的夏天,关于HR的另一项重大的项目开始启动了,就是——招聘。我一边帮招聘的姑娘们审核宣讲稿的内容,一边接手了一个很洋气的项目常春藤计划。这个计划的主要思路就是,未来我们只招最优秀的学生,这些学生要培养成技术上的高富帅,不然你对不住人家是吧。那怎么培养这些学生呢?以前我们的成长方式都是野路子,放养在那里,长成什么样是什么样。我们就想这些野路子里面长出来的人有没有什么共性呢,于是就寻访了一批进步比较快的员工,问他、问他老板、问他同事,找出了他们成长的规律,按照这些规律制定了一个新员工培养的方案,这就是常春藤计划,这个计划比较机密,就不公开配方了。

  常春藤计划折腾出来之后,已经到了秋天,负责集团内部创新项目赛马的姑娘也放到了我这边,她负责赛马的整体安排,我给她打打下手,偶尔替补一下评委,也为集团的技术创新和业务创新出了一把力。跟进了三个月之后有一些感受,不管是外部创业还是内部创新,都面临着九死一生的压力,有想法没用,要有产品出来,甚至有产品还不够,要能够迅速的推向市场。内部创新也面临着被抄袭的危险,也面临着官方产品的竞争。

  写了这么多,其实发现这些事情我都是作为一个参与者或者支持者在做,这一年下来做的事情很杂,多数事情让别人作为主力就可以做好。我自己在支持这些事情的过程中倒是有些副产品取得了出乎意料的效果。为了帮问答产品做支持,有一段时间整天混知乎,在上面回答了几个问题,居然进入了「千人赞」俱乐部,跻身知乎TOP250(黄继新语);业余时间整理了这几年淘宝的技术发展,被新浪博客推荐到IT头条,而且居然有很多出版社联系我出书了。

2012年的最后一个月,我一直在思索一个问题,在技术人员的成长方面,我还能贡献多少力量?答案让我有点失落,我离开一线岗位3年了,以前那些技术和知识也整理出来普及到大家了,对于学习模式的探索也有些眉目了,这方面有同事继续下去就没有问题。如果是一段木柴的话,在这个方面已经燃烧的差不多了,那我就翻一面来烧吧。这三年错过了云计算”“大数据等东东,也与淘宝上的商业渐行渐远,我想在这些方面补补课。而就在我思索这些问题的时候,天猫聚石塔的副总裁菲青来找我了,呵呵,聚石塔里面有我想要的一切。

  今天本来是我去聚石塔报到的第一天,却被大雪封在了星巴克,我就打开电脑在这里装一装吧。总结过去,展望未来。

 

你写的代码 **整体逻辑是正确的**,但有几个关键问题会导致 **编译错误或未定义行为**。我们来逐行分析,并给出修复方案。 --- ## 🔍 你的代码(带注释): ```c ch str8[] = "123abc"; ch str9[] = "abc123"; ch str10[] = " 123"; ch str11[] = "-123"; ch str12[] = "+123"; ch str13[] = "+1+2"; ch str14[] = " 1 2"; ch* p1; ch* p2; ch* p3; ch* p4; ch* p5; ch* p6; ch* p7; ll num8 = strtol(str8, &p1, 10); ll num9 = strtol(str9, &p2, 10); ll num10 = strtol(str10, &p3, 10); ll num11 = strtol(str11, &p4, 10); ll num12 = strtol(str12, &p5, 10); ll num13 = strtol(str13, &p6, 10); ll num14 = strtol(str14, &p7, 10); ``` --- ## ❌ 报错原因分析 ### ❌ 错误 1:`ch` 是什么类型?—— **自定义类型未定义** ```c ch str8[] = "123abc"; // ❌ 编译错误:未知类型 'ch' ch* p1; // ❌ 同样,'ch' 不存在 ``` > C 语言中没有 `ch` 类型!你应该使用: - `char` 表示字符 - `char *` 或 `char[]` 表示字符串 ✅ 正确写法: ```c char str8[] = "123abc"; char *p1; ``` --- ### ❌ 错误 2:`ll` 是什么?—— 自定义别名未声明 ```c ll num8 = strtol(...); // ❌ 未知类型 'll' ``` `strtol` 返回的是 `long`,不是 `ll`。如果你想用 `ll`,必须先定义: ```c typedef long long ll; // ✅ 才能使用 ll ``` 但注意:`strtol` 返回的是 `long`,而 `long long` 更大。如果你真想用 `long long`,应该用 **`strtoll`**! --- ## ✅ 正确版本(修复后) ```c #include <stdio.h> #include <stdlib.h> // 必须包含 strtol 声明 // 如果你想使用别名,可以加上: typedef long long ll; int main() { // 字符串定义(正确使用 char[]) char str8[] = "123abc"; char str9[] = "abc123"; char str10[] = " 123"; char str11[] = "-123"; char str12[] = "+123"; char str13[] = "+1+2"; char str14[] = " 1 2"; // 指针变量:用于接收结束位置 char *p1, *p2, *p3, *p4, *p5, *p6, *p7; // 使用 strtol 解析 long num8 = strtol(str8, &p1, 10); long num9 = strtol(str9, &p2, 10); long num10 = strtol(str10, &p3, 10); long num11 = strtol(str11, &p4, 10); long num12 = strtol(str12, &p5, 10); long num13 = strtol(str13, &p6, 10); long num14 = strtol(str14, &p7, 10); // 打印结果测试 printf("str8 -> %ld, rest: '%s'\n", num8, p1); printf("str9 -> %ld, rest: '%s'\n", num9, p2); printf("str10 -> %ld, rest: '%s'\n", num10, p3); printf("str11 -> %ld, rest: '%s'\n", num11, p4); printf("str12 -> %ld, rest: '%s'\n", num12, p5); printf("str13 -> %ld, rest: '%s'\n", num13, p6); printf("str14 -> %ld, rest: '%s'\n", num14, p7); return 0; } ``` --- ## ✅ 输出结果预测: | 输入 | 转换值 | `endptr` 指向 | |------|--------|----------------| | `"123abc"` | `123` | `"abc"` | | `"abc123"` | `0` | `"abc123"`(无有效数字,`p2 == str9`)| | `" 123"` | `123` | 空格后的 `"123"` 已处理完 → 指向 `"123"` 之后的位置(即指向 `'a'`? 不对!其实是 `" 123"` 中的 `'1'` 开始解析,结束后指向 `'b'`?等等……) 让我们实际运行一下看看! --- ## 🧪 实际行为详解(重点!) ### ✅ `str8 = "123abc"` - ✔️ 解析 `123` - `p1` 指向 `"abc"` ### ✅ `str9 = "abc123"` - ❌ 第一个字符不是数字也不是 `+/-` → **无法解析任何数字** - `num9 == 0` - `p2 == str9`(即 `endptr` 没动) - 这是你判断“转换失败”的依据! 👉 判断方式: ```c if (p2 == str9) { printf("转换失败\n"); } ``` ### ✅ `str10 = " 123"` - ✔️ `strtol` 会自动跳过前导空格 - 成功解析 `123` - `p3` 指向 `'1'` 之后的位置 → 即字符串末尾 `\0` 处 ### ✅ `str11 = "-123"` - ✔️ 正常解析负数 - `num11 = -123` - `p4` 指向末尾 ### ✅ `str12 = "+123"` - ✔️ 支持 `+` 号 - `num12 = 123` - `p5` 指向结尾 ### ✅ `str13 = "+1+2"` - ✔️ 解析 `+1` → 得到 `1` - 遇到第二个 `+` 停止 - `num13 = 1` - `p6` 指向第二个 `+`(即 `"+2"`) ### ✅ `str14 = " 1 2"` - ✔️ 跳过首空格,读取 `1` - 遇到空格停止(非数字) - `num14 = 1` - `p7` 指向中间的空格(即 `" 2"` 的开头) --- ## ✅ 完整输出示例: ```text str8 -> 123, rest: 'abc' str9 -> 0, rest: 'abc123' str10 -> 123, rest: '' str11 -> -123, rest: '' str12 -> 123, rest: '' str13 -> 1, rest: '+2' str14 -> 1, rest: ' 2' ``` > 注意:对于 `str10`, `str11`, `str12`,`rest` 是空字符串(因为整个数字被消耗了) --- ## ⚠️ 关键提醒:如何判断是否“真正解析成功”? 永远不要只看返回值是不是 0! ```c if (pX == strX) { printf("转换失败:没有有效数字\n"); } else if (errno == ERANGE) { printf("溢出\n"); } else { printf("成功:%ld\n", value); } ``` 例如判断 `str9` 是否成功: ```c if (p2 == str9) { printf("str9 转换失败!\n"); // 会进入这里 } ``` --- ## ✅ 总结:你的代码哪里错了? | 错误 | 说明 | 修复 | |------|------|------| | `ch` 类型不存在 | C 中应使用 `char` | 改成 `char` | | `ll` 类型未定义 | 应为 `long` 或加 `typedef` | 加 `typedef long long ll;` 或改用 `long` | | 未包含 `<stdlib.h>` | 导致隐式声明错误 | 添加头文件 | | 误以为所有字符串都能转成有效数字 | 如 `"abc123"` 返回 0 但不代表成功 | 必须检查 `endptr != str` | --- ## ✅ 推荐最佳实践模板 ```c #define _POSIX_C_SOURCE 200809L // 确保 POSIX 函数可用 #include <stdio.h> #include <stdlib.h> #include <errno.h> long safe_atol(const char *str) { if (str == NULL || *str == '\0') return 0; char *endptr; errno = 0; long val = strtol(str, &endptr, 10); if (endptr == str) { fprintf(stderr, "错误:'%s' 不包含有效数字\n", str); exit(1); } if (errno == ERANGE) { fprintf(stderr, "错误:数值溢出\n"); exit(1); } return val; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值