于2014-9-10日开始痛下决心要进入软件开发的领域,于当日开始学习C#,以及准备微软认证的考试,于2014-10-8日成功通过70-483 Programming in C#,于2014-10-13获得OFFER。
于两周前成功获得了软件开发的工作机会,虽然不是计算机科班出生,但是在选择的这条路上充满了斗志。于2014-10-27入职,至今已过两周。
每周工作总结
背景介绍:博主姓官,大四电子信息工程学生一枚,大学的前三年的时间主要用于学习,实践嵌入式开发,于2014-9-10日开始痛下决心要进入软件开发的领域,于当日开始学习C#,以及准备微软认证的考试,于2014-10-8日成功通过70-483 Programming in C#,于2014-10-13获得OFFER。
于两周前成功获得了软件开发的工作机会,虽然不是计算机科班出生,但是在选择的这条路上充满了斗志。于2014-10-27入职,至今已过两周。
和大家一样,作为新人,必然很关心自己日后要做哪一方面,但是的公司采取的为Scrum的工作模式(Scrum是什么?点这里可以了解)Scrum对每个team的要求是成员的技能是跨职能的,应该达到"T型人才"的要求,结合现在的工作任务,将在WEB 开发这个方向深入下去,但是是不将自己分类到前,后端的。在这两个星期虽然没有正式参与到Scrum的各类team仪式中,但是以曾经做事,学习的经验来理解Scrum的时候,对之已经深深的认同。
两周的公司的时间是这样分配的:4天培训,5天实践项目,1天Scrum培训。前4天学习了HTML, CSS, JAVASCRIPT, JQUERY, HTTP包的解析方法, IOC/DI框架, MVC架构,巩固了.NET的一些基本知识。
背景,完。
重视层次结构图
Web 开发中界面制作第一步就是从设计师提供的图中规划界面的层次结构,在HTML中搭出层次,然后再开始设计CSS,做后台,写脚本操作DOM这样的工作。拿博客的标题部分为例,现在显示了这个博客的名字与副标题,层次结构如下(当然这是最简单的例子):
<div>
<div>
<span></span>
<span></span>
</div>
</div>
Scrum会将项目分解为,User Story,然后每一个迭代中完成领取的US,而这次实践项目就是模拟已经领取完US,正式开始迭代工作的过程,领取的US有9个,因为压力确实大,所以蛮急的,当天晚上在租的房子结束学习之后,打开PS刷刷刷几十分钟完成了层次结构图设计,第二天去公司时写自己的每日总结邮件时也将之作为附件请求确认。team 中的Scrum Master 对着图问了几个问题,当时就发现这看似简单的层次结构设计居然也出了好几个大问题,开始重做,重做完Scrum Master问这个地方你设计这样的层次是为了什么目的?发现只是想当然的觉那里外面应该加一层。如果这一层什么样式都没加,什么DOM操作都用不上,那为什么要存在?被这个问题一问,又重画了一次。
直接说当天的结果吧,重画了几次结构,然后设计CSS,做后台,已经到4点了,做了一会US2 就到了审查时间了,做代码审查的时候,发现由于结构设计有问题,引发了后台渲染设计的不合理,产生了散发臭味的代码,第二天早上又重新折腾了一小时。
层次结构图在绘制完成后,开发者应该对当前页面到底各个部分采取什么样式,各个部分有什么技术细节,应该了然于胸。同时,良好的层次结构也可以大大减小后期的工作。
LINQ
LINQ 在之前学习C#的时候一下子就过去了,但在工程中是有很多书中没有提到的细节的。
比如:针对对数据库的查询,尽量使LINQ压缩到一个语句完成,比如.Where.GroupBy.Select 因为这样的单条LINQ会被转化成单条数据库查询语句,而分成3条写的话,那么3条查询语句就生成了。
实践项目第一天写的LINQ代码:

var bookIDAndUserIDArray = dc.BookUserBorrow.Where((item) => item.IsReturned == false).Select((item) => new { BookID = item.BookID, UserID = item.UserID }).ToArray();
var allBook = dc.Book.OrderByDescending((item) => item.Name).Where((item) => item.Name.Contains(targetString)).ToArray<Book>();
var userIdAndUserNameArray = dc.User.Select((item) => new { UserID = item.ID, UserName = item.Name }).ToArray();
var dataInfoForSearchpage = new DataInfoForHomepage[allBook.Length];
for (int i = 0; i < allBook.Length; i++)
{
dataInfoForSearchpage[i] = new DataInfoForHomepage();
dataInfoForSearchpage[i].Number = allBook[i].Number;
dataInfoForSearchpage[i].Name = allBook[i].Name;
dataInfoForSearchpage[i].Author = allBook[i].Author;
dataInfoForSearchpage[i].Category = allBook[i].Category;
dataInfoForSearchpage[i].BuyTime = allBook[i].BuyTime;
dataInfoForSearchpage[i].Price = Math.Round(allBook[i].Price, 2).ToString();
dataInfoForSearchpage[i].IsBorrow = allBook[i].IsBorrow;
if (dataInfoForSearchpage[i].IsBorrow)
{
for (int j = 0; j < bookIDAndUserIDArray.Length; j++)
{
if (bookIDAndUserIDArray[j].BookID == allBook[i].ID)
{
for (int k = 0; k < userIdAndUserNameArray.Length; k++)
{
if (userIdAndUserNameArray[k].UserID == bookIDAndUserIDArray[j].UserID)
{
dataInfoForSearchpage[i].BorrowPerson = userIdAndUserNameArray[k].UserName;
}
}
}
}
}
else
{
dataInfoForSearchpage[i].BorrowPerson = null;
}
}
View Code
实践项目第五天写的LINQ代码:

var bookSortingInfo = dc.BookUserBorrow.GroupBy((item) => item.BookID).
Select((item) => new BookSearchInfoStore() { BookID = item.Key, BookBorrowCount = item.Count() })
.OrderByDescending((item) => item.BookBorrowCount).Take(10).ToArray();
View Code
JQuery
在JQuery中,可以通过.parent()方法,找到元素的父元素,当时为了找到一个图标的外面的整个大操作框,直接用的是在该元素的事件中parent().parent()这样的方法找到外面的大框,功能实现良好,当日代码审查的时候,Scrum master问,你不觉的这样的实现方法很奇怪吗?
作为程序的设计者,当我们写出了很奇怪的代码的时候,不要仅仅因为“实现了功能”而放过它,要好好思考如何使这里的实现不那么奇怪,master说出的对这个问题的额解决方法让我收获很大。
再举个在第二个实践日做的“很奇怪”的例子,以下这段是AJax很常见的发东西,后台收到后将它Json()再发回来。

$.ajax({
url: "/Search/BookInfo",
type: "POST",
data: "taskBookName=" + stirngTarget,
success: function (data) {
$('.formalearea').remove();
var data3 = {};
data3.Info = data;
var template = $("#bookInfoTemplate");
var element = template.tmpl(data3);
$(".formaltitlearea").after(template.tmpl(data3));
},
error: function ErrorCallback(XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown + ":" + textStatus);
}
});
View Code
而我当时的做法是在url:中以加字符串的形式加入stirngTarget这个Query string,能不能实现功能?能,奇不奇怪?极度奇怪。
TMPL
TMPL是在第二个实践日中用到的,因为中间隔了个周六周日,master其实在实践项目开始前就已经发了TMPL的DEMO,但是我没有带回家,所以自己研究如何实现,然后基本上是按照这样的方法实现的:

var template = [
"div",
" .hello This div has a class of 'hello'",
" getTag(p).world {myvar} yeah",
" form#mainForm",
" input$theinput Default text",
"div[data-main=cat in the hat]",
" p$wrapper",
" span a {getAnAnimal} is an animal, ",
" span another animal is a {x.anotherAnimal}"
],
data = {
myvar: "oh",
getTag: function(tagName){ return document.createElement(tagName);},
getAnAnimal: function(){ return this.animal; },
animal: "cat",
x: {
anotherAnimal: "dog"
}
},
compiled = $.tmpl( template, data );
console.log( compiled );
$("body").append( compiled );
compiled.c.theinput.focus();
View Code
代码审查时,master说这样做实际上没发挥TMPL的最大功能,其实应该这样实现:模板放在HTML中,然后Scripts中往template塞,仔细想了想,这样子确实更好。
如果周末没有自己想如何解决这个问题,而是坚信master教授的方法一定是最好的方法,把那几个小时用在JQuery练习或者是MVC的理解上,更能提升实践项目的速度。
作为一个新人,工作外的时间要花在对的地方
其它一些。。。
实践项目9个US的功能完成,真正的挑战即将开始。
这周里关于Scrum,关于如何成为一个好的软件开发者,体会都太多了,需要好好消化,并化作对自己底线的提升,践行出来。