经过创联理事会决定,我们原来的“秘书组”的定位过于简单和狭隘,现撤消此小组。
同时,针对目前项目开发及社团活动的需要,新设立“运营组”。小组的技术方向为项目管理、项目运营、产品设计;亦有社团活动组织及支持及外联的工作职责。
原秘书组成员自动转入运营组。
欢迎对以上方向感兴趣的同学报名加入运营组。
经过创联理事会决定,我们原来的“秘书组”的定位过于简单和狭隘,现撤消此小组。
同时,针对目前项目开发及社团活动的需要,新设立“运营组”。小组的技术方向为项目管理、项目运营、产品设计;亦有社团活动组织及支持及外联的工作职责。
原秘书组成员自动转入运营组。
欢迎对以上方向感兴趣的同学报名加入运营组。
提示:
fork MITHomework repository on GitHub/ifLab first
git clone https://github.com/your_username/MITHomework
git branch your_name
git checkout your_name
git add file_name
git commit -m “lesson 1”
git push -u origin your_name
modify your readme file like this:
MITHomework@student id@group name
https://blog.jobbole.com/50603/
本文由 伯乐在线 – 吴鹏煜 翻译自 sixrevisions。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。
当我刚刚开始使用Git的版本控制时,我根本不确定我付出那么多时间是不是会得到回报。Branch、Stage、Stash,这些Git名词对我来说都非常陌生。
而今天的我已不能想象生活没有Git会变成什么样。Git不仅提供了我非常需要的版本控制功能,还让我变成一个更优秀的程序员。
这里有一系列可以帮助你的小贴士,可以让Git成为你开发工作中非常重要的一部分。
学习Git的基本操作并不是要求你把整个Git文档从头到尾读完(但如果这就是你的方式,我也不会反对)。
Git里面有太多的教育内容,我很确定里面一定有对你胃口的最佳学习方式。
看一下以下这些Git学习资源吧:
少即是多。
常常的,Git会和一个复杂的工作流联系起来。不过我可以这么说:你还暂时不需要为了Git的诸多好处,而一下子变成Git大师。
Git的工作流是可以非常简单的 —- 而且在许多情况下你需要的就是这么简单。你当然可以用multiple remote repositories、issue pull request、rebase changes等等,但是你不想用这些的话完全可以不用。
从简单的工作流入手也会使日后添加复杂性或者使用Git高级功能变得简单。当你需要使用这些功能的时候,Git已经准备好了。
这里有一些不同的Git工作流的例子,你可以从他们的想法中得到启发
总的来说:不要因为觉得Git什么都要学就压力很大,你完全可以从今天开始使用Git。
Git最出色的一点是:它几乎是100%易上手误操作的。
记住以下几点会让你晚上睡得更香:
在Git里面,分支这个概念是你一开始能学到的最有用的东西了。分支允许你隔离开发你的项目,而要想成为一个高效的Git用户,这是非常关键的一点。
一开始这听起来好像不是什么大事,但一旦你完全的理解了分支概念,你会开始想没有这个你怎么活下去。
尽管其他的版本控制系统也会使用分支概念,Git是第一个实现它,并让它变的好用的系统。
这里有一些有助你了解Git分支概念的资源:
当你的提交里面只包含一些相关的变化时,版本控制会变的非常有用[b],它保证了你的提交可以被没有任何副作用的回滚,经常提交的习惯也可以让你的同事更好的了解你的进度。
Git有个功能叫暂存区让这一切都变为可能
学习使用暂存区,并爱上它,因为这是Git里面最重要最独立的一个模块。
尽管使用图形界面绝对不会是一个要求,但我还是高度推荐使用。
使用图形界面让大多数操作都变得简单,让你在项目开始时便占尽优势。
不管怎么说,使用Git不应该只是记住各种命令和参数,而是改进你的编程工作流。如果图形界面可以做到这一点的话,没有理由让简单的事变的困难嘛。
看一下这些Git界面吧:
使用图形界面并不能减轻你学习Git基础的负担,不过一旦你快乐的征服了Git,使用这些工具会让你的生活变得更轻松。
使用一个新工具一开始会让人非常头疼,走过这条学习曲线的方法只有一个:继续走下去。
做一个充分的承诺,不要回头。在你平常的工作流里引入Git很快就会被证明这是你近期做的最大的,最有意义的决定。
避免这种情况:「我会在这个项目里使用Git,但其他项目就再说了。」至少一开始不要这样。
充分承诺的这种心态会让你有更多的机会去练习,让事情变得更加简单,因为你知道你现在这个项目用了版本控制系统。而更重要的是,让Git成为你的编程习惯。
未来不久,你就会看到只有那么一些情况不需要用到Git,
对自己做一个100%的承诺,作为Git征服之路的开始。
时间:2013-11-3(周日) 2:30PM(健翔桥校区) 7:00PM(小营校区)
地点:健翔桥校区网管中心,小营校区实验楼一层机房
主题:Git、Github的使用,常用技术网站介绍
内容:
负责人:马奎@iOS
Note: 请各位组长通知组员注意出席。
PLSQL Developer不是独立的软件,是要基于Oracle客户端运行的。而实际的Oracle数据库庞大的身材实在是让人难以接受。实际上只需安装一个简单的客户端即可实现远程登录的目标。
1、到Oracle官方网站下载一个客户端:https://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html //时间长了该网址可能会失效,如果无效了话大家直接baidu instantclient即可
2、我这里选择的是:即时客户端程序包 — Basic: 运行 OCI、OCCI 和 JDBC-OCI 应用程序所需的所有文件(instantclient-basic-win32-11.2.00.70.0.zip)
3、将安装包解压到:F:\Program Files\instantclient_11_2
4、设置环境变量:
1.;F:\Program Files\instantclient_11_2; (在PATH环境变量追加)
2.SET TNS_ADMIN=F:\Program Files\instantclient_11_2 (新建)
3.SET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK (新建,防止查询乱码) 这里具体的设置得和oracle目标服务器一致,常用的还有AMERICAN_AMERICA.ZHS 16GBK
5、指定需要连接的实例名字,在F:\Program Files\instantclient_11_2目录下新建一个tnsnames.ora文件,然后填入
appdb = //服务名 同下service_name,机登录时的数据库,如下图
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = db) //这个字段和服务器名一致即可,不一致也不影响使用
(SERVICE_NAME = appdb)
)
)
6、接下来对plsql developer配置,如下图在工具->首选项中设置instantclient的路径。
分别为F:\Program Files\instantclient_11_2
F:\Program Files\instantclient_11_2\oci.dll
7、工作全部完成后即可重启plsql developer输入账号信息后连接数据库
时间:2013.10.20周日下午2:30(各组长通知)
地点:健翔桥网络中心
内容:
负责人:朱劲寿@云计算
ps:各组长通知组员活动时间
22号健翔桥,23号小营校区的现场招新工作顺利结束了,感谢参与招新工作的同学们!
https://sbbs.me/view_article/5225fb0f60e794ae6c000004#
“软件开发,长夜漫漫,何以脱困,唯有Trello!”
在最近的一段时间,开始全面采用Trello管理团队的开发工作,并因此对敏捷软件开发,有了一些新的思考…
软件开发的管理工具,千千万万,为何会选择Trello呢?别人选择的理由,也许各有不同,而我的选择,则来自于我对于软件管理的基本看法:
基于以上这些理由,我们选择了Trello,容我细细道来。
Trello是一个非常容易使用的Web应用,当然他还有iPhone、iPad、Android的移动版本。 上手最简单的办法,是使用Google Account登录,连注册都不需要了。
登录Trello以后,有一个Welcome Board,演示了一些最基本的用法,也可以看一看视频:
Trello可以用来管理很多不同的个人事务、团队任务,而每一种类型的任务,其协作模型是大不相同的。这正是Trello最令人赞叹的地方,其他所有类型的管理工具,都没有这么方便的自定义流程模型的能力。
在定义协作模型时,我强烈建议在每个work环节之间,设置一个等待环节。这种设置的原因,有一个简单的解释,以及一个复杂的理论支撑。
简单的解释就是:当我完成了自己这个阶段的工作,并不意味着下个阶段即刻开始,放入等待区,可以表明由下一阶段的人员挑选的含义。如果直接拖入下一阶段,可能会造成下个阶段的人正在同时忙很多事情的假象。
详细的解释,可以参考《精益开发实战——用看板管理大型项目》一书。
在我们的实际开发中,定义了一下几个List:
目前,我们的用法是,不再区分内测、外测、压测等各个阶段,而是给卡片标上不同颜色的label,代表它通过了什么样的测试。
目前看来,似乎可行。不过,我总感觉不是太对。
另一个选择是:用label代表不同的卡片类型,比如功能、bug、hotfix等等,不过目前来看,还没有总结出较为稳定的实践经验,也期待与其他trello用户多多交流。
总之,在使用Trello的过程中,我们一直在讨论,更好的用法,以及更加习惯的用法。
Trello是一个非常直观的工具,仅仅通过肉眼观察,就可以发现很多管理中的问题,并及时加以改进。
Trello是个看板系统,但是,仅仅像这样的直观的观察看板,是不够的,我们需要对自己的工作有更加深入的了解。还好,Trello提供了非常强大的API:Trello API Documentation
非常简单的一些代码,就可以访问Trello的Board数据,然后将这些数据导出来,做进一步的分析。
从我们的需要出发,有两个数据结构需要深入了解:
在OAuth登录之后,访问:https://api.trello.com/1/boards/board_id/cards 可以得到一个Board中的所有的卡片的数据。其中一个卡片的数据结构如下:
{ id: "50bc61474d0451697100116f", badges: { votes: 0, viewingMemberVoted: false, subscribed: false, fogbugz: "", checkItems: 0, checkItemsChecked: 0, comments: 0, attachments: 0, description: false, due: null }, checkItemStates: [], closed: false, dateLastActivity: "2012-06-03T14:02:18.556Z", desc: "", descData: null, due: null, idBoard: "50bc61474d04516971001162", idChecklists: [], idList: "50bc61474d0451697100116b", idMembers: [], idMembersVoted: [], idShort: 1, idAttachmentCover: null, manualCoverAttachment: false, labels: [], name: "Welcome to Trello!", pos: 65536, shortLink: "2px9lS4p", shortUrl: "https://trello.com/c/2px9lS4p", subscribed: false, url: "https://trello.com/c/2px9lS4p/1-welcome-to-trello" }
而访问一个卡片的所有Actions,则可以通过以下API:https://api.trello.com/1/card/card_id/actions?filter=all 其中一个Action的数据结构如下:
{ id: "5229ee9e68a889bc250020ee", idMemberCreator: "50bc61464d04516971001161", data: { board: { name: "Welcome Board", id: "50bc61474d04516971001162" }, card: { idShort: 7, name: "Invite your team to this board using the Add Members button", id: "50bc61474d0451697100117c" }, text: "test" }, type: "commentCard", date: "2013-09-06T15:02:54.629Z", memberCreator: { id: "50bc61464d04516971001161", avatarHash: "", fullName: "zhuangbiaowei", initials: "庄表伟", username: "zhuangbiaowei" } }
通过Trello API,我可以将数据导入到本地的一个SQLite3的数据库中,表结构如下所示:
CREATE TABLE cards ( id text, cat1 text, cat2 text, cat3 text, name text, closed boolean, last_date date, last_list text ); CREATE TABLE actions ( id text, card_id text, type text, data text, date date, creator text ); CREATE TABLE card_move ( id text, card_id text, before text, after text, date date, creator text ); CREATE TABLE card_time_count ( card_id text, user_id text, time_count float ); CREATE TABLE card_wait_time( card_id text, list_id text, time_count float ); CREATE TABLE work_time( card_id text, user_id text, end date, work_time float ); CREATE TABLE last_date( last_date text );
从卡片被创建开始,将会经历很多的改变,这些改变都会被记录为一个一个的Action,在Action的JSON数据结构中,有一个type属性,代表着action的类型。其中createCard、updateCard、addMemberToCard、removeMemberFromCard较为重要。
怎么到现在才来讨论命名规范呢?因为,关于命名的问题,是在卡片多了以后,才浮现出来的。
卡片多起来了,分别属于不同的项目,不同的模块,不同的版本;这时候,我们小组面临另一个选择:就是每个项目开一个Board,然后分别管理。
但是,这个构想被迅速的否决了,因为这些卡片的工作都是交替进行的,我们衍生出了一个“主工作Board”的概念,90%的小组工作,都在一块板上体现出来,而不是散落在各个不同的地方,否则,总会有漏看的时候。
于是,我们的命名规范是这么定的:[部门-项目-模块]卡片名。这是我们目前的用法,其实还有两个纠结:
第一个问题,目前我们没有明确标明,不过感觉今后应该更加规范起来,但是如何规范,是用命名还是用颜色label,还在犹豫中。
第二个问题,介于我们现在的具体工作,很少能够划分清晰的版本号,所以也没有使用。
对于一张卡片的粒度,我们其实没有什么仔细的“把握”,实际的做法是:借助数据统计工具,不断追求缩短每张卡片的完成时间(这样做的后果是,卡片的粒度会越来越趋于微小。);另外从测试的角度,确保每一张卡片,可以被独立的、有效的测试。(这样的后果是,卡片的粒度,不会无限制的越来越小。)
最小可测试单元,是我们发明的一个新概念,通过将开发工作划分为一个一个的最小可测试单元,我们将最大限度的减少工作环节之间的等待情况。
以一张卡片来举例:如果一张卡片,需要8小时才能完成,那么测试人员,最快也要在8小时后开始测试;如果8小时的卡片能够分解为4张2小时的卡片,那么测试人员最快在2小时后,就能够开始工作。
就好比在瓶子里装石头,石头的颗粒越小,则瓶子内的空间才能够被越充分的利用,这就是通过减少浪费与等待,从而实际提高工作效率的办法!
上文描述了一张卡片的生命周期,而在实际的开发过程中,我们肯定会面对很多很多张卡片,这些卡片除了有各自的生命周期,更组成了一共不断生长的树状结构。
我们可以参照WBS(工作分解结构)来理解这些卡片,企业有多个产品、每个产品有多个版本,每个版本有多个需求和多个bug,每个需求有可能分解为多张卡片来开发测试。
当我们根据某种规范来命名卡片以后,再将数据导入到本地的数据库,就可以很方便的做出一个统计表格,来统计各个项目的当前状况:
这样的统计,当然还只是一个很初级的静态汇总。更加深度的玩法可以有:
所谓估算能力,不是用来衡量普通开发者的,而是用来衡量开发管理者的。一个模块、一个需求,在最初被分解为多少张卡片,这是一个初始估算。
随着团队开发效率的逐步稳定,我们可以切实的根据分解卡片的数量,对整个项目的工作量,做出预估。
到了项目结束时,我们可以得到一张图表:“卡片增长趋势图”,一个团队管理者的能力,就在于是否可以尽早的、尽可能准确的估算卡片的数量。如果,卡片在开发后期出现意外增长,则意味着一开始的估算,出现严重偏差。
这也是开发管理者,需要不断提高估算能力的地方。
除了规模估算能力,还有进度估算的能力。在不了解真实的开发效率的情况下,开发管理者通常有两个选择:高估以保护手下、低估以后压榨手下。
这两种方法,是典型的过犹不及,都不是什么好事。正确的做法是:根据实际的工作量与工作类型分布,推出一个开发团队的进度模型,进而对实际的需求,进行进度估算。
在此之前,所有的估算,都不过是耍流氓而已。
直白一点说吧,我反对功能点估算这种学院派的算法,无比复杂,却毫不实用。只适合用来考试,根本不适合用来工作。
不考虑具体技术实现的工作量估算,根本就是在耍流氓。他们那14个所谓的调整因子,也不过是纸上谈兵而已。
在我看来,IFPUG这种组织,也无非是搞了一个巨复杂的标准规范,然后搞认证考试来赚钱罢了。
说说我的看法吧:在项目具体实施之前,越是过去没有尝试过的、缺乏经验的新项目,越是难以估算工作量与预期时间,强行估算工作量,只会增加更多无谓的“估算工作量”。
另外一个指标,我倒是建议需求方,认真估算一下:就是某一个项目、某个功能、某个User Story,可能带来的价值回报。换句话说:如果能够花钱购买这个Story,我愿意出多少钱?
传统的估算,通常都是工作量估算,一个项目30个人月。然后项目组开始拼死拼活的去干。就算一切顺利,我们10个人,干了3个月,做完了30个人月的一个项目,然后呢?无非是投入了那些工作量而已。于是,老板的眼睛就会一直盯着每日考勤统计表,看看这帮家伙,是不是每天都在加班,如果他发现没人加班,就会痛感自己“压榨得还不够”。
如果我们采用价值点估算,一共100个Story,价值100万。我们10个人,第一个月就完成了价值50万的Story。作为老板,根本不必关心我们是在一个月里,每天干10小时做完的;还是每天干6小时做完的。相对而言,如果我们能够每天6小时就干完,只怕他应该更高兴,因为这样为他省电了。
前段时间的某一天早上,我因为机缘巧合,居然早早的就醒了,于是突发奇想,决定主动为家里人,做一顿早饭。我打开冰箱,查看了里面的存货,然后略微思索,最后做了炒鸡蛋、蒸馒头、以及煎葱油饼三个高难度的动作。
经过妻儿试吃,评价居然尚可,我顿时有种洋洋得意的感觉。
我是多么的敏捷啊!在短短的30分钟时间里,我根据现有的条件,做出了兼具营养与美味,而且足以果腹的一顿早餐。所谓看菜做饭,不就是敏捷里的高效快速迭代吗?我们不做计划,但是,我们可以随时灵活调整。
不过,我并没有自我陶醉太久。进一步的思考涌上心头:
抄一段我过去的文章吧:
后来,软件大师们,发明了一个新的办法:既然不能指哪打哪,那就打哪指哪。既然不能在给定的时间内完成任务,那么就反过来画个圈,这个阶段咱们完成的任务,就是咱们的阶段目标。 在给这种“掩耳盗铃”开发模式,起了一个漂亮的名字之后,这种敏捷开发的方式,在全世界流行起来了! 但是,真正“精明”的老板,是不会上当的!在敏捷开发模式下,开发人员永远是无可指责的!所有的开发进度,开发人员拥有无可争辩的主导权:“每一个Story的开发工作量都已经被估算出来了,产品经理能够选择的,仅仅是在下个阶段先实现哪几个Story而已。” 老板们通常会说:“三个月内,我要看到这个上线,不要告诉我不可能!公司的信条是:没有借口!”
所以,像我这样做早饭是不够的。
所以,仅仅敏捷是不够的。
所谓敏捷,不过是由于软件开发过程中,各种因素难以估算,而采取的权宜之计。真正的解决之道,不是打哪指哪,而是通过合理的工具,掌握真实的开发情况,进而做出切实的工作量估算与进度计划。
这样的解决之道,我认为Trello也许是一个极好的开始!