此次论文仿真中,需要对虚网映射的过程进行改进。在原先只考量CPU和带宽的基础上为链路增加VLAN属性,并在映射过程中分配VLAN、检测VLAN是否用尽。经过三天的阅读,这里把仿真包里embed.c这个主要文件的各函数分析在下面,方便日后修改。

数据结构

数据结构存储在embed.h中。

  • struct_link 描述物理链路,有from、to、带宽三个属性
  • request 虚网请求,有split, node, links, CPU[], bw等多个属性。
  • substrate_network 底层物理网络,有nodes, struct_link links等属性
  • s2v_node 被映射了虚网的物理节点的状态
  • s2v_link 被映射了虚网的物理链路的状态
  • path 逻辑链路映射成的多段物理链路
  • req2sub 描述虚网映射的实时映射关系
  • shortest_path 最短路径,通过Floyd算出(用于链路映射)
  • bneck 瓶颈节点

相关函数

节点映射

find_proper_node

目标:在当前底层物理网络中寻找rest_cou最适合(rest_cpu和request CPU最近,且大于它)当前虚节点的节点。

find_MinNeighborResource_node

目标:在当前底层物理网络中寻找rest_cpu满足要求,且自资源最不丰富的物理节点

衡量标准:节点rest_cpu * sum(rest_bw)

find_MaxNeighborResource_node

目标:在当前底层物理网络中寻找除了exclude节点外的rest_cpu满足要求的,且自资源最丰富的物理

节点

衡量标准:同上

find_available_node

目标:在当前底层物理网络中,从一随机起点出发,寻找第一个rest_cpu满足要求的物理节点

map_node_greedy

目标:在当前物理网络中,为特定index的虚网映射进行节点映射,哟西按占用资源最丰富的节点,成功则更新物理网络的状态(s2v_node, s2v_link),失败则对已映射的节点进行拆除。

map_node_star

目标:在当前物理网络中,为第一个请求节点分配资源最丰富的节点,其余逻辑节点随机分配,成功则更新物理网络的状态(s2v_node, s2v_link),失败则对已映射的节点进行拆除。

链路映射

由于链路映射算法大多很复杂,这里将算法流程也一并列在下方。

unsplittable_flow

目标:为不可分割流进行链路映射

算法流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
0  初始化变量,位置分配内存空间
1 死循环
1.1 找到请求中状态满足要求(完成了节点映射)且收益最大的请求,直到状态全部更新
1.1.1 存储id,改变其标志位
1.2 判断该请求状态,与是否可分割
1.2.1 找到该请求的所有逻辑链路
1.2.1.1 找到它们的起始、终结物理节点
1.2.1.2 判断它们是否已找到之间的最短路,否则继续寻找
1.2.1.2.1 Floyd矩阵找下一跳
1.2.1.2.2 下一跳若不可达,break
1.2.1.2.3 寻找有没有实体链路对应Floyd的下一跳
1.2.1.2.4 如果没有,或者有但是rest_bw不够,break
1.2.1.2.5 吧路过链路的可用带宽减少,将当前链路存入到路径数组中
1.2.1.3 如果上一步失败,给sub1(底层物理网络)划分内存空间,在sub1里删除上步出现问题的链路
1.2.1.4 在sub1里算出Floyd矩阵,并存储在临时变量里
1.2.1.4.1 一个类似于1.2.1.2的循环
1.2.1.4.1.1 若还不行,break到1.2.1.4.2;若可以减少可用带宽,存入到路径
1.2.1.4.2 返回错误物理链路、虚拟链路、虚网请求id
1.2.1.5 存储当前算出的路径,与逻辑链路一一对应
2 将状态标志位全部清零
3 死循环
3.1 找到请求中状态满足要求(完成了节点映射)且收益最大的请求,直到状态全部更新
3.1.1 存储id, 改变标志位
3.2 判断该请求状态,与是否可分割
3.2.1 更新时间与链路状态值
3.2.2 为请求内的spath赋值(len, bw)
3.2.2.1 为spath内的各段物理链路赋值
3.2.2.2 更新物理网络链路状态
4 释放临时变量空间
5 返回-1(虚网请求成功标志)

multicommodity_flow

目标:打印基本信息

算法流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1  打开测试文件
2 指定范围内检测有误状态符合条件的请求,
3 若没有,则返回-2并关闭文件
4 打印出满足要求的链路总数
5 打印基本信息到文件
6 打印ARC COSTS到文件
7 打印ARC CAPACITIES到文件
8 打印NODE INJECTIONS到文件
9 打印ARC MUTUAL到文件
10 打印NETWORK TOPOLOGY到文件
11 打印LOWER AND UPPER BOUNDS到文件
12 打印SIDE CONSTRAINTS到文件
13 关闭文件对象
14 运行lintest文件
15 返回 0

检测

check_flow

目标:检查映射情况

算法流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1  打开test文件,初始化变量
2 查找STATUS字段,停在此处
3 若不可执行,且阶段 0,则关闭文件,返回 -3
4 若不可执行,且阶段 1,则继续
4.1 查找VARIABLE字段
4.2 在每条链路上查找已使用过的情况,为s2v_link赋值
4.3 查找SIDE CONSTRAINTS字段
4.3.1 找到过载最严重的链路
4.3.2 找到该链路占用最多贷款的租户ID,及其占用带宽,并确定请求ID和虚拟链路ID
5 其余情况,查找OPTIMAL字段,若找到,则继续
5.1 查找VARAIABLE字段
5.2 在每条链路上查找已使用过的情况,为s2v_link赋值
5.3 为v2s赋值
6 关闭文件,释放内存
7 打印租户ID或-1(成功标志)

资源分配

同样,算法复杂,将具体流程列在下面

allocate

目标:整合节点、链路映射完成虚网映射的核心部分

算法流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1  为变量s2v_node,s2v_link,v2s划分空间,赋初值
2 为节点数组req_count清零
3 将请求按收入大小排序,找出最大收入者,为它进行节点映射,知道请求的节点映射全部完成
4 若全部未完成节点映射,返回-1
5 初始化链路映射相关变量
6 找到瓶颈节点,并进行链路映射(尝试)
7 若映射成功或链路可分割,用新方法找到瓶颈节点
8 循环:
8.1 如果上一步尝试成功,为s2v_node, s2v_link赋值,跳出循环
8.2 否则,计算这一批次的cost之和
8.3 找出剩余资源最少的节点ID,及其剩余资源
8.4 随机从上面移除一个虚拟节点
8.5 找到这个节点以外资源最丰富的节点,成功则映射到这个新节点;否则映射请求失败
8.6 检查有误未完成链路请求的虚网请求,无则跳出循环
8.7 若时间正忙而无法映射,try=门限+1,找到未完成的请求ID
8.8 cost清零,try+1,打印try次数
8.9 若try > 尝试门限,释放资源,更改状态,还原try
8.10 否则,找到瓶颈链路上的任一节点外的资源最丰富的节点
8.10.1 若找到,则映射;否则这个请求失败
8.11 检查链路映射是否完成,为s2v_node, s2v_link, v2s赋值
9 检查当前瓶颈节点,尝试链路映射
10 为s2v_node, s2v_link等赋值,用cost防止重复操作
11 检查新映射是否cost更低,是则更新
12 #允许迁移则继续向下
13 计算原始cost,释放原始映射资源,进行新的映射
14 新的映射成功则计算新cost,否则返回 0
15 新的cost是否更小,是则迁移,否则不做操作
16 还原s2v_node, ltmp
17 用unsplittable映射计算一次cost,若新的cost更小,则迁移;否则不作操作
18 更新s2v_node, s2v_link v2s
19 返回 0

辅助

calculate_cost

目标:返回指定范围内的虚网请求cost之和。cost算法同上

筛选标准:完成链路映射

exist_req

目标:查找是否存在完成了节点映射,未完成链路映射的请求。存在,则返回0,否则返回-1。

主函数 main

算法流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1  为v2s, s2v_node, s2v_link, sub, req 赋初值
2 打开底层网络文件
3 为sub赋node(sub.s2v_nod(req_count,rest_cpu,cpu),sub.link(from,to,s2v_l,rest_bw))
4 关闭文件
5 循环打各req的文件
5.1 为req的revenue/nodes,links,split,time,duration,topo)赋值
5.2 循环为req的cpu,link.from,link.to,link.bw赋值
5.3 计算出revenue
6 关闭文件
7 为临时变量s2v_node/ltmp2/v2stmp2/spath分配内存空间
8 计算得到spath值
9 初始化临时变量
10 循环:
10.1 循环检测所有完成链路映射的请求,为done_count+1
10.2 更新done,rev,cost,map状态,若映射完成则释放资源
10.3 计算当前req.rev/cost/count
10.4 写入当前数据到文件
11 为当前所有请求进行映射
12 依次次检测所有请求状态,更新未请求成功的状态与错误计数器
13 打开stat文件
14 为成功的虚网请求释放资源
15 计算当前req,dev/cost/count
16 写入当前数据到stat文件/trace文件
17 关闭文件
18 返回 0

技术总结

在和辰光师兄共事这么久后,深感自己在技术外的眼界(诸如产品、商业模式甚至更广的看法)和收获今非昔比。但是,对于追求实效和本质的我来说,技术的本质不能忘。若这些日子以来,只是富士康式地劳动,而不去反思技术,便丧失了实习的大部分意义。因此,尽管web编程,php后台,前端设计这些我以后可能用不上,但是开发思想是共通的,这里总结写收获在下面,希望日后再翻起,会觉得有所帮助。

关于调试技巧

开发和调试一定是共存的。因为大家的运气不会好到一次通过。适当的调试技巧有助于更快地完成需求(即设计的功能)。web编程的调试较有IDE环境的调试要更困难些,因为它project的概念并不明显,且web编程是多种语言的综合。包括php,asp等后台技术,html,javascript,css等前端技术。在没有编程环境下的调试,web也有它自己的style.

工具

浏览器的开发者工具是调试的利器。里面提供的element,network,sources,console等功能可以在前、后端给开发者反馈。以下就我的实践分别介绍之。

  • Element里可以看到网页源代码,各标签的格式。这里主要完成:1. 对css或是class样式设计进行反馈,开发者可以实时改变样式,所见即所得。觉得合适后,直接在后台照抄Element里的设置即可。2.观察有无标签错位或是id,class有误的情况,这个是html代码不能直接给你答案的。综上,前端应用较多
  • Network里可以看到页面呈现过程中所接受的文件。这个对于后台尤其是ajax开发则来说是极其重要的。这里有几点可以注意的:1.接受到的究竟是哪些文件,有需要的文件没有接收到么;2.点击文件后看到的内容是不是想要的,能不能反映问题。之所以说ajax很需要它。因为普适的var_dump大法在这里只有借用Network才能看到结果。
  • Sources主要用在对代码尤其是js代码段进行带断点的调试,alert大法固然好用,复杂的循环或选择结构存在时,断点会让你方便许多
  • Console也是前端大杀器。主要用于js调试。1.它能显示js error,这些会让js实效,但是它在页面是绝不会呈现出来的。2.能直接通过cli的方式检测js语句是否正确,磨刀不误砍柴工,这能让你能提高你写js时的成功率。
  • 剩下的就是Resources最常用,主要是因为它的记录cookie和session的功用。

方法

网页的呈现一般在编写完代码之后,除了浏览器的开发者工具外,php和js也有类似于printf,cout大法这样的调试方法。(说到这,顺便吐槽一句,IE的F12经常崩溃,chrome的Ctrl+Alt+I就从未遇到过这样的问题。且chrome的还有测试移动端甚至网速的定制,很对我胃口)php里最常用的就是var_dump()+die,它比printf强大的地方在于,它能把变量的详细情况呈现出来,谁用谁知道。js我没有研究过,但是alert()+return false(后一部分可以不要)已经很够用了。

思路

1.当程序原理上正确无误时,所有问题总会有原因。

2.二分法在猜测上总是效率最高的,优先将断点设置在段的中间位置。一步步寻找,答案就出来了。

关于常见问题

错误是web编程里的家常便饭(其他编程也是如此)。但实际上,很多错误的起因却是一样的。这里列举一些常见问题的原因。

  • 不匹配问题。这类问题包括大括号不匹配(很常见),标签不匹配,特殊语句不匹配。页面乱码或错得离谱时,很可能就是它导致的。
  • 有多余的无意义字母夹杂。这类问题包括夹杂在关键字里,夹杂在标签里,夹杂在语句里,夹杂在变量里甚至夹杂在空白处。第一、二、四种情况会报错xxx未定义,第三、五种情况则和具体位置有关。因为web编程多半使用vim远程完成,快捷命令极多的vim会让这种情况较为常见。
  • 没有预防特殊情况。包括空值或者负值等临界情况。这类问题比较隐蔽,一般不会出现,但是出现就可能导致重要问题。不过,比较好的是,加上检验语句还是不费功夫的。
  • 缺少空格。看起来可笑,实际却很常见。尤其在sql语句的处理上最甚。因为后台的sql基本上都是拼接而成的。所以字符串连接时若缺少了空格就会报sql错误。暴露数据库是很危险的。其他的,若html标签的属性间忘了加空格,属性值就会不起效果。
  • 误删或错误字符。这个也很常见。短的包括尖括号导致失配,长的包括语句段。不过好处在于,vim的u命令是很好用的。实在不行,还有git一直在监控。
  • 。。。。。。
    一般的错误问题都不会太大,多半是马虎粗心导致,掌握好上面说的调试方法,还是比较容易发现并修复的。

关于对vim和git的理解

因为需要在服务器上做操作,我学会了vim,并爱上了它。因为团队开发需要对项目的版本进行管理,我又学会了git,并爱上了它。它俩有个共同点,就是注重效率和轻便,但是功能强大。以下,分别谈点自己的认识。

从vim开始。vim不是编译器,更不是IDE,它只是个文本编辑器。但是配合了插件的vim使用起来和IDE一样顺手,甚至更方便。vim的特点很明显:1.纯命令行操作,鼠标可以扔掉了;2.极多的快捷键,若能熟练掌握,会相当方便。第二点是vim上手难的原因,但也是它厉害的原因。删除、选定、查询、替换等复杂的功能,vim几乎都能一键完成。我现在正在使用的vim配合了cscope.nerdtree,ctag。cscope可以寻找变量或函数的定义,nerdtree可以切换工作目录,ctag可以查看变量,函数列表,通过部分文字在工作环境下查询文件。这让代码的编写很是轻松。另外,vim的fold,补全等功能和配色也让它在快捷的同时达到了IDE的效果。桌面环境很吃资源,vim的存在让web程序员们能愉快地编程。

git是种习惯,而不只是工具。git的本地commit和鼓励分支的特点不止影响了技术。文档尤其是编程格外需要数据的安全性和可恢复性。git这个版本控制工具让程序员们可以无后顾之忧地修改文件,并且让团队间的合作变得简单可行。因为有rebase,git的本地提交的弊端被很好弥补了,多次细致的提交能让代码改变更易阅读;另外,由于git存储文件的思想和指针很类似,因此它鼓励分支并不会加重自己的负担,从而让项目开发限制更小。

对于技术方面的整理就先到这么多,有些积累说得清,有些积累说不清,说得清的我尽量写在这里,说不清的希望也当成为习惯留在脑海。

补充:商业模式

之前和辰光师兄交流时谈到的商业模式难以抄袭的问题,忘记记录下来,今日偶然想到,仍觉很有道理。这里补充记录下我的理解。

互联网产品的同质性很严重,越来越难难找到独一无二的产品。因为,只要有产品出现,简单的复制技术,就可很快的推出相仿的山寨版。阿里、腾讯、百度就可如此,技术的复制是很快的,流量和用户习惯又由他们把握。所以,这个年代,即使互联网市场风生水起,光靠点子进行互联网创业,最好的归宿也只有被BAT三家收购,卖个好价钱。这自然是创业者不想见到的。既然技术的抄袭难以避免,为何美团和饿了么仍然活得好好的,滴滴和快的也能共存,因为商业模式是抄不了的。

我们不妨对比一下,技术的抄袭抄过去的就可以了,我雇两倍的人、出两倍的价钱挖人才,就肯定能在同样时间做出更好的作品。商业模式的抄袭抄过去的一定不管用,因为,你只能看到竞争对手过去的规划,而不能看到他将来的举动。所以,这种抄袭是不靠谱的,只能跟着原创者的屁股后面走。正因此,做产品不只是技术问题,好的商业模式规划能让产品升华。

推而广之,这是否能应用到其他方面呢。总结起来就是,你很难做第二个谁谁谁。正是因为你猜不透他下一步要做什么,上一步在以后的规划中起着什么作用。这也从另一方面体现出实现规划的重要性。

今晚与师兄两人回校,聊起互联网分工时,师兄不免又多说了许多。说着说着,话题又过渡到人生道路上。因觉得颇有共鸣,这里依旧流水账般,记在下面。

关于互联网分工

产品

个人认为,互联网分工的必要组成部分是产品,产品分PM和PD两种,PM和PD上有产品总监。PD即Product Designer,产品经理。负责具象化用户需求,交给技术去实现。话说起来简单,但实际上,具象化需求不是那么好做的,产品总监提出大体构想后,PM多半会召集身边各部门开会,并去整理会议上各方杂乱的美好设想。首先,总监的构想有时会很模糊,甚至会有方向上的错误;其次,会议上各方的建议并不能覆盖所有细节,尤其是枯燥的细节。毕竟产品做不好是PD背锅。接下来,整合好的具体需求是不能直接拿给技术看的,否则很容易被砍死。PD需要融合、简化需求,减轻技术团队的压力。产品,做出来才是真的。接下来,把任务交给PM。除此以外,PD需要尽量为自己所带领的技术团队争取资源,作为挡箭牌处理和营销以及运维的关系甚至办公室政治,这也是让产品成功的重要一点。综上,PD是个多方受压的角色,一旦失误很容易背锅,同时它也是产品流程的重要一环,把控好产品方向,安抚好烦躁的程序员,着实压力巨大。所以,有句古话说得好,PD常有,好的PD不常有。

PM即Project Manager,项目经理。和PD在互联网产品开发中是多对一(多PD)或一对一的关系。PM需要将需求进一步细化到技术上,拆分成各个部分,交给手下的技术团队完成。同时,PM负责把握工程的时间进度。时间过了deadline是没法交差的。PM不一定得很懂技术,但一定得能让技术团队信服(虽然大多数的PM都很懂技术)。否则,手下心不齐,三天两头添乱,PM是很不好受的。毕竟产品开发不完,是它背锅。相比PD,PM距离技术更近,也会经常参与技术团队的开发。

营销

产品从设计到原型结束后,交给营销团队推广拉客。营销部门只负责拉客,并不负责接客。因为它的kpi是按照入驻用户数来计算的。营销又称销售,它做的工作和安利很像,负责为产品招揽足够数量的客户。为了保证每月或每天kpi的硬性要求,营销会将产品好的一面,甚至没有的一面展示出来。这里遇到了两个矛盾:第一,为了产品能卖得更好,营销部门会向PD施压,改变产品需求,使得更种各样的用户都能入驻。万一这时PD不够“硬”,技术团队就要砍人了。第二,营销的kpi不包括客户流失率,毕竟不是它负责接客,不负责任的拉客和承诺很容易招揽垃圾用户和愤怒的用户,这就要考验运营部门的智慧了,它要努力把人留下来,并用甜美的笑容迎接客户的怒骂。可见,运营部门也是个很考验心理素质的地方。

运营与技术

营销说完了,下面是运营。运营的KPI包括客户流失率。上面说过,用户反馈的所以负面意见90%都由运营部门的客服来扛着。产品当然不会做出的第一版就很完美,因为用户是不会接触到产品原型开发的。运营吃的营销的亏,会扔给产品和技术。埋怨产品是怎么设计的,并向PD施压,要求改变产品需求(这话听得怎么那么耳熟),因为用户反馈blablabla。这时,重复修改是无法避免的,PD再调整,PM下的程序员免不了做重复工作。如果调整得不好,技术砍死产品经理就会发生

技术分两种。第一种是学术型技术,多半不会和产品、营销、运维三个部门一起提,即真正的技术。它是埋头做的,不一定短时间内就会生效的。大公司里会分成专门的部门。第二种是工程型技术,和产品在一起提到,很多互联网公司会有“技术池”这个概念,即程序员们的工作并不固定,自己自由选择或分从分配到某个产品线,和某个PD合作。

综上,我们看到,产品、运营、销售是三个相互坑与被坑的角色,矛盾统一的是它们的目标一致——这个产品的前景。换句话说,它们是一条绳上的蚂蚱,相互间痛并快乐着。高工资不是白拿的,它们的压力透过文字就可以辨别出。

关于悲惨的程序员

程序员的悲惨,其实是不需要这段文字就能看出来的。对需求的重复修改是程序员即普通技术的噩梦。技术(以下均指普通技术)的KPI是按照需求数量来计算的。PM把需求分解,按照难度打分后,交给技术完成,很像完成成就。如果PD或PM的功底不够,产品细化的不够狠,技术的KPI就会比较难看。这还不算悲惨。如果PD不够“硬”,产品原型还没出来,就被销售改了几个需求,技术的开发工作就会重复进行,而新的实现方法是不计入KPI的。不计入KPI倒可以忍,改得晚,deadline就在眼前才是最要命的。实际上,程序员加班并不是工作量大,而是重复工作太多了。而PD里有许多应届,出色的PD少,这也就成了业界程序员的常态。

产品推出后,运营也加入了挤压产品、技术的队伍,技术又会针对客户的反馈进行修改。大家也猜到了,这个修改也是不计入KPI的。如此多的工作,却对KPI毫无贡献,悲惨的程序员该怎么想呢?呆不下去就走呗!这也是互联网离职率高的重要原因。

以上讲了技术跟错了产品和产品经理的悲剧。好的产品新修改多,重复修改少,KPI高,年终奖拿到手软,不好的产品线注定会多处很多重复修改,却,见不到用户量的大提升。如果我们隐忍的程序员还没有放弃,产品线终于崩溃了。这时,技术面临两种命运,一,等着被随机分配到另一个产品线上,用鸟枪法找一个靠谱的产品和产品经理;二,原来工作努力上进,口碑好,被好的产品线挑走,从此人生改变。可见,对于技术来讲,找一个信得过的产品是多么重要;幸运的是,对于产品经理来说,找一个信得过的技术也是很重要的(产品实现不了是它背锅)。说到底,这里做事还是看人。

关于技术的前途

工科学校出身,有技术功底,出去最有可能就是技术了。那该选择什么道路,能避免上面的悲惨命运呢?上面也提到了,说大了,技术无非两种,研发型和工程型。前者强调在深度,后者强调在广度。因此,对于前者,在知识上的精深,对高深技术的掌握很重要,Google、微软中国这样的公司将是理想的归宿,尤其是对于技术痴迷者。若出世没那么厉害,互联网等公司的研发岗也是不错的选择。这一切的前提是,得好好学习。

工程岗,又称技术民工。在知识上的灵活,对多领域的技术掌握、有工程技术实践经验很重要。因为,技术毕竟不能干一辈子。长期来看,管理岗位是理想选择;短期来看,PM是最好的跳板,如果因为产品线大限已到,或是因为其他原因调岗后,能因为之前的经验升任PM。那恭喜,你终于能翻身农奴把歌唱,由被坑的角色,转成坑人的角色了。不过,这个几率在你跟对产品线才会比较大。

看来,说到底,还是得跟对人。

近日,和做产品经理的师兄一同返校。聊了许多,顿觉收获颇大,在此以故事的形式一并记之,想到哪儿写到哪儿,以励后进。

师兄本科写了四年的代码,保研去了经管院,实习先后去过咨询公司,外企,互联网三巨头BAT,也算是对产品和商业模式有了些自己的认识与理解。最后借现在这家创业公司的环境,实践以前之所学。

关于创业

创业分五个阶段,第一个阶段,产品由无到有,几个核心成员借由最初的idea,用技术完成一个雏形。这个阶段用技术去证实这个产品是可行的,因此技术占了这个阶段绝大多数工作。产品雏形是它的终点;第二阶段,产品雏形出现以后,团队开始扩张,初创成员开始出现分歧,技术以外的部门诸如融资、营销等会加入团队,这是个不稳定期,需要有“领导”角色的产生和团队内的磨合。一个较为成熟的商业模式在这个阶段形成(注:商业模式的规划是一开始就要做的)。一般,A轮融资发生在这之间,股权的划分也是对团队的考验。成熟的商业产品和商业模型是它的终点;第三阶段,有了融资和统一的产品规划后,将这个商业模式做大,通过烧钱推广产品。这个阶段里,我们会用数据去衡量产品的发展前景,运维、行政等部门又会加入。当用户数出现质的提升时,证明商业模式在社会上可行。这也标志着第三阶段的结束。在这之后,公司一般会迎来B轮融资,以千万起。而大多数公司都倒在第二、三阶段。

第四阶段,商业模式被证明可行后,在各个维度上推广复制,开辟到不同城市、不同周边领域。利用融资继续扩大规模,一般到此,创业者会获得真正的财政自由;第五阶段,公司继续扩张,迎接IPO。在这两个阶段间遇到的困难会大大小于前三个阶段。

综上来看,难倒大多数创业者的门槛反而成了团队内的团结统一。的确,扪心自问真正信得过的合作伙伴太少了,剩下的就好好珍惜吧。现在,我就在一家创业公司的第二阶段,面临着产品从雏形到成熟过程,尽管技术团队人很少,暂时也没有一套成熟的工作模式。不过这种创业的氛围恐怕也能让我学到不少。包括和PM的沟通,技术和需求间的取舍等。如果这条路能跟着走下去的话,学到的将是BAT教不了我的。

关于开源软件与商业模式

正巧这阵在做一个开源小工具,和同寝的技术一起合作开发。就顺便问起了小团队开源开发需要注意的地方。师兄提到,开源软件并非只有免费公益这么简单,从商业模式角度去考虑,这是推广市场或积累口碑的最好选择。以Symbian和Android为例,后起的Android为何为打败Symbian,开源占了很大一部分原因。可是开源的同时,Google难道就没有收益么?正是因为Google核心的商业模式在其搜索引擎上,Android是自带Google搜索的,这才是它关心的;而且Android的知识产权是Google的,这将给Google隐形的收益。以CSDN为例,里面有许多写技术博客的开发者,在开源自己产品的同时,获得了转发,评论等社会影响力,这笔关注在求职或是发表言论将会发挥到它的作用。

所以,有时问题换个层面去思考,会得到很有意思的结果。在开发开源产品的时候,从商业模式上去考量,会得到以前从不会想到的一些问题。合理的商业模式将使产品被用户所接受,甚至会给自己带来收益。

关于眼界与技术

自然科学,社会科学,人文科学这对于一个大学生来说都是需要的。不同的方面的了解将会使你对问题有不同的认知方式。这也正是综合性大学在学生培养上的天生优势。北邮是所很靠谱的理工科大学,所以培养出的学生严谨有余,而灵活、情怀不足。社科赋予人对社会和人际的了解,人文赋予人对艺术和设计上的了解。在创业型公司里,工作中出现的问题种类会比大公司多,多方面的掌握有时会给我们很大的启示。

在说到创业时,师兄突然感慨似乎我们都陷入了完全做好准备再出发的怪圈,许多半路出家边走边学的人却提前取得了成功。难道是研究生严谨学术的氛围使得毕业生们都不肯轻易出手么?研究生的两年半里,不要把眼光限得太死,不要抱着技术不放手,要勇敢接受新事物,展示自己的学习能力,接触更多方面的人,这可能是现阶段对我最好的启示。

而那个开源小项目,可能也得重新思考了。

1月1日,一个值得纪念的日子。校园网告别免费时代。学校美其名曰合理化用网,提升学生们的用网体验。实际上,之前流量用不完的现在依旧用不完,之前“流量大户”的现在忍痛充值也会继续用。10G流量的悬顶之剑,实际上没吓退多少人,只是增加了部分人的刚需消费而已。

不是我说“屁股决定脑袋”,要想真正达到预设的目的,首先就不该一棒子打死所有人。固然,占用大多数流量的人,“是时候让他们流点血了”,但这决不是简简单单一个10G就解决的。没有调查的行动,当然会引起大部分群众的反感。在1个月内的试运营的时间里,也没看到“相关部门”做出的什么调查报告。在我看,多档流量的区分会更好。也没见北京地铁一口价吧。

其次,尽管不能完全“疏”,这种硬“堵”的方式很容易让人误解学校的做法。因此,我不同意学校做出的不能使用运营商网络的决定。正是此决定让大家忍痛也会尽量保持之前的需求。这里很像广电的做法,一刀切,不过审的就是不许上,没有个其他的途径。而硬性需求就像水,有缝总会找地方流走的。不能像电影分级一样么,给观众另外的渠道,起到引流的效果。

说完学校政策方面,我们再来从另一个角度聊聊。窘迫了这么多天,包括我在内的一些人都会感叹,流量总是不够用,要是能有包月服务,一定会大受欢迎。但是,我认为,如果以后真将推出,那包月服务会是个糟糕的决定。设想,学生们交了钱,继续往日的用网习惯,该卡的时段还是卡。学生的用网习惯并未改变,只是多交了些钱罢了。这样,学校本就颇受诟病的目标将更加变味了。毕竟,理想地,网费是次要的,提升网络质量才是主旨。可是,谁又知道学校下一步会怎么改变甚至会不会改变呢,就像半年前谁知道延续数十年的免费午饭在我们这儿就到此为止了。

最后,可以说说群众的不同反应。收费后的群象和乱象不仅令我回想起小时候的场景。那时,父母所在的厂公转私,这是个大事件。有很多员工面临着买断工龄下岗的危机。整个镇都有些人心惶惶,有人骂骂咧咧拿钱走人,有人精明地提前在市区里找了新工作,有人忿忿不平欲和厂领导说理,大部分的人和我的父母一样,没有多提什么只是默默接受着,为留下来做些自己的努力。终于,一个夜晚,几个工人代表带着大批群众聚集在领导办公场所旁,要求立即解决问题。那晚,事情变得有些难以收场。最后,代表们被劝退,事情不了了之。一个多月后,父母换了工作地点,但并未下岗,事情渐渐平息。

说到这里,你联想到什么了呢。哪些人骂骂咧咧拿钱走人?哪些人提前找了新工作?哪些人聚众说理却不了了之?又是哪些人默默接受着?同样的,可以想见,在新政策下来后,无论是合理也好,畸形也好,事情都将会平息,群众总有它独特的适应方式的。至于盗用流量等等的恶性事件,只是从大的校园环境放到了时下的校园网收费环境而已。

0%