《大教堂与市集》读后感

1)每一个好的软件的起因都是挠到了开发者本人的痒处—–需要是发明之母。
 
2)好的程序员知道写什么。伟大的程序员知道改写(和重复使用)什么。
 
3 计划扔掉一个;无论如何你都会扔掉一个的。(弗里德·布洛克《人月神话》第11章)
或者换句话说,直到你第一次实现一个方案之前,你常常并没有真正理解你的问题。
第二次呢,或许你已经学到了如果把它做对。所以你要是想把事情做对的话,准备好至少重来一次。
 
4)如果你有正确的态度,有意思的问题会找到你。
 
5)当你对一个项目失去兴趣时,你的最后的职责是把它交给一个称职的继承者。
 
6)把用户像合作者来对待是通往快速改进代码和有效调试的最佳通道。
 
7)早发布。常发布。听取用户的意见。
 
8)如果 beta测试者和合作开发者的群体足够大的话,几乎每个问题都会快速显形,会有人轻而易举地把它解
决。或者通俗一点,“只要眼球足够多,所有臭虫都好捉”。我称之为“林纳斯法则”。
 
9) 人们 一般在一项任务处于一种适当难度范围的时 候享有乐趣;不要太简单了至于无聊,不要太难了不好实现。一个快乐程序员是一个既没有被浪费也没有被错误制定的目标和烦人过 程摩擦所压倒的人。  

野猪和家猪的故事

野猪和家猪的故事

一天,一只野猪不知怎的闯进了农民的猪圈。
野猪看见猪圈里躺着的几只家猪,不禁诧异地问道:
“看你们的样子多么像我,你们都是猪吗?”
一只家猪打了个呵欠,懒洋洋地回答说:“是啊,我们都是猪。这点还用怀疑吗?”
野猪说:“你们怎么变得这样懒懒散散,没精打采的,丝毫没有猪的气势和精神。我们在山林里并不是这样的呀!”
家猪道:“我们在这儿,吃了睡,睡了吃,有人伺候我们,舒服极了。还要到山林里去干嘛?朋友,你也留在这儿享福吧!”
野猪听了,叹道:“哦,原来如此!我得赶快离开这儿,不然我也要变成和它们一样的懒货了!”

发布流程

a)后台系统发布
1.确认所有人是否还在修改代码,源代码是否全部提交。
2.获取最新源代码,编译通过,进行冒烟测试。确认最新版本没有问题。
3.生成tag标签版本。
4.修改配置文件(数据库连接等配置),确认相应的配置是否正确。
5.发布程序,release当前最新的代码。
6.系统更新。
    1.发布的程序拷贝到服务器。
    2.停止系统
    3.备份程序及数据库。
    4.更新数据库。
    5.更新程序,
    6.重新启动程序。
7.确认发布的程序没有问题,进行的冒烟测试。
如果没有问题,则发布成功。若有问题,则程序回滚。

b)客户端软件及更新程序发布

1.将接收的软件安装包或更新程序备份。
2.将软件安装包拷贝到服务器相应的位置上。
3.在后台添加一条软件或更新程序对应的数据。
4.检查新增的软件安装包或更新包是否正确。

发布流程考虑

发布流程考虑

灰度发布

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面 来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

  • 多级发布

    也可以称为分步代码发布, 是一种代码发布的方式 。基本操作是整个团队共用一个代码库,一定频率(比如每天一次,或者每周一次)把整个代码的最新版本做一个新的发布分支(release branch),把发布分支逐步发布到产品线。

特点:”逐步选择”的过程不由代码控制(如果代码控制,那新一版本的控制代码有问题就可能让整个代码发布过程崩溃)。“逐步选择”过程由运营团队负责:比如选择每个机柜的第一台机器,或者每个机群的第一个机柜,或者多个数据中心里面选择某一个数据中心⋯⋯关键是选择的时候是均匀分布到各种不同的机器上。如果新代码在某一种配置的机器上有问题,运营团队能够及时发现。

监控: push一般要做实时的监控:代码逻辑错误的信息按照代码版本(比如svn revision number)来分类,保证新版本的代码不带来新的错误;硬件的信息(CPU内存IO)按照选择的机器、机柜、机群、数据中心分类:保证新的版本不引起更大资源消耗。当以上的信息都确认之后,可以给更大规模的机器安装新代码。

  • AB测试

    这是一种很成熟的概念,是 产品发布的常用手段 。比起分步代码发布,AB测试往往有更长的周期(比如几个星期甚至几个月)。基本操作是产品的开发者加一个或者多个配置控制(一般每个产品配置应该带有配置的ID),允许通过调节相应的配置来让一个产品发布到“逐步选择”的用户群。

特点:“逐步选择”是一个有代码控制的逻辑过程。一般的产品基于用户ID选择;也有基于IP或者其他信息的。

监控:AB测试的数据一般按照产品配置ID和打开/关闭状态分类,分析某个产品配置在打开的时候和关闭的时候对用户行为的影响,和对硬件资源的消耗,由此可以预测这个产品在100%发布之后的影响。

从概念中可以看出多级发布和AB测试中最重要的区别: 面向对象不一样 。多级发布针对的是 代码发布 ,AB测试针对的 产品发布 。

互联网应用在交付上线过程中(运维部门的职能),需要经过灰度交付和A/B测试两个环节,前者用于检验系统是否稳定可靠,满足上线要求,需要收集和分析性能数据来决定;后者用于检验到底新版本好还是旧版本好,需要收集和分析用户访问数据来决定。

阿里灰度发布引擎参考


发布前测试优化?

上线前测试简化

测试环境与正式环境切换

  • 数据库问题?

  • 现有API应用?

一个人最好的样子

    
    一个人最好的样子就是平静一点,
    哪怕一个人生活,
    穿越一个又一个城市,
    走过一个又一条街道,
    仰望一片又一片天空,
    见证一次又一次别离。
    然后在别人质疑你的时候,
    你可以问心无愧地对自己说,
    虽然每一步都走的很慢,
    但是我不曾退缩过。

PetaPoco 使用总结(二)

 

  接着上一篇,上一篇主要介绍了PetaPoco 基本情况,优缺点和基本的查询功能,所以这篇主要介绍的是PetaPoco 的增,删,改等功能。PetaPoco提供了完整的增,删,改,查功能。是代替SqlHelper辅助类的不二选择。

  插入对象:需要指定的表和它的主键。

var a=new article();
a.title
="My new article"; a.content="PetaPoco was here"; a.date_created=DateTime.UtcNow;
db.Insert(
"articles", "article_id", a);

 

  如果是T4模板自动生存的Poco 对象,直接  a.Insert() 即可 。

  更新一条数据或是更新某个字段:

a.content="Balah balah";
db.Update(a);

  

  删除

// Delete an article extracting the primary key from a record
db.Delete("articles", "article_id", a);

 
// Or if you already have the ID elsewhere
db.Delete("articles", "article_id", null, 123);

 

  定义Poco类,或者通过T4模板生成,这样增删改查会更加简单:

// Represents a record in the "articles" table
[PetaPoco.TableName("articles")]
[PetaPoco.PrimaryKey("article_id")]
[PetaPoco.ExplicitColumns]
public class article
{

    [PetaPoco.Column]publiclong article_id { get; set;}

    [PetaPoco.Column]publicstring title { get; set;}

    [PetaPoco.Column]publicDateTime date_created { get; set;}

    [PetaPoco.Column]public bool draft { get; set;}

    [PetaPoco.Column]publicstring content { get; set;}

}

 

  增加

var a=new article();

a.title="My new article";

a.content="PetaPoco was here";

a.date_created=DateTime.UtcNow;

db.Insert(a);

 

 

  修改

a.content="Blah blah";

db.Update(a);

 

 

  删除对象

db.Delete(a);

 

  删除某条或多条记录

db.Delete
("WHERE article_id=@0", 123);

 

  修改一个对象的单独几个字段:

db.Update
("SET title=@0 WHERE article_id=@1", "New Title", 123);

 

  同时,你可以告诉PetaPoco 忽略某个字段,给该字段加上 PetaPoco.Ignore 特性 即可

public class article
{
    [PetaPoco.Ignore]
    public long SomeCalculatedFieldPerhaps
    {
        get; set;
    }
}

 

2014年书单

计划:
1. 番茄工作法图解:简单易行的时间管理方法      (完成)
2. 大数据:互联网大规模数据挖掘与分布式处理
3. 量化:大数据时代的企业管理
5. 黑客与画家:来自计算机时代的高见             
6. 倾听的力量:如何掌握沟通中的关键商业技巧  
7. 失控      凯文·凯利

8. 罗辑思维        罗振宇
9. 说服力让你的PPT会说话 : 让你的PPT会说话  张志/刘俊/包翔
10. 影响力 (经典版)                                            (完成)
11. 哥德尔、艾舍尔、巴赫书:集异璧之大成
12. 活着      余华                                           (完成)
13. 别闹了,费曼先生
14. 漫漫自由路:曼德拉自传
15. Peopleware / 人件集:人性化的软件开发
16. Enterprise Integration Patterns –企业集成模式:设计、构建及部署消息传递解决方案
17. Head First Design Patterns

18. 敏捷软件开发原则 模式与实践
19. Documenting Software Architectures: Views and Beyond–软件构架编档
20. 企业应用架构模式
21. 快速软件开发
22. 与下属沟通的7个技术       

23. 卓越管理者说话之道      
24. 与熊共舞:软件项目风险管理
25. 实用IT项目管理(第2版)
26. 项目管理艺术
27. 沟通用故事产生共鸣
28. 拆掉思维的墙
29. 决策
30. 说话的魅力      
31. 软件架构师的12项修炼
 
新增: 

 天龙八部             (完成)
 梦里花落知多少   (完成)

 围城                   (完成)

2012年书单

计划:
     1. 浪潮之巅      (已读)                                                           

     2. CLR via C#
     3. C#高效编程:改进C#代码的50个行之有效的办法   (已读)
     4. 编程之美——微软技术面试心得
     5. Microsoft SQL Server 2008技术内幕:T-SQL查询
     6. Oracle PL/SQL程序设计
     7. MongoDB权威指南
     8. 持续交付:发布可靠软件的系统方法   (已读 部分)
     9. 敏捷软件开发:原则、模式与实践     (已读) 
     10. 高效程序员的45个习惯:敏捷开发修炼之道       (已读)  
     11. 硝烟中的Scrum和XP——我们如何实施Scrum     (已读) 
     12. 高性能JavaScript  
     13. JavaScript DOM高级程序设计   (已读)
     14. 启示录:打造用户喜爱的产品    (已读)
     15. 程序员修炼之道        (已读,后面看没明白)
     16. 代码大全

 

新增: 
 
     1. 人人都是产品经理 (已读)
     2. 编写高质量代码 -改善成C#程序的157个建议 (已读)
     3. Don’t Make Me Think(已读)
     4. 大规模Web服务开发技术(已读)
     5. 你的灯还亮着吗?(已读)
     6. 大教堂与市集 (已读)
技术类杂志
 
     1.《程序员》杂志

PetaPoco 使用总结(一)

PetaPoco 使用总结(一)

前段时间,公司的一个项目希望用一个ORM 的框架,通过对比 Dapper 和 PetaPoco ,虽然Dapper 功能很强大,速度更快。 但是最终还是选择了比较简单的PetaPoco。 因为PetaPoco更加的简单,所有的代码只有1500多行。通过一个项目的试验,PetaPoco使用简单,无任何需配置,无需冗长的映射文件,性能也不错。

PetaPoco是一款适用于.NET应用程序的轻型对象关系映射器(ORM,  Object Relational Mapper)。与那些功能完备的ORM(如NHibernate或Entity Framework)不同的是,PetaPoco更注重易用性和性能,而非丰富的功能。使用PetaPoco只需要引入一个C#文件,可以使用强类型的 POCO(Plain Old CLR Object),并支持使用T4模板生成的类,和支持.net 4.0 的 Dynamic对象等等。

最近,随着许多开源项目的发布,微型ORM已开始成为一种流行趋势。其他一些众所周知的适用于.NET的项目有Dapper和Massive。那些微型ORM相对于功能完备的ORM而言,会更简单、更高效,微型ORM通常要求开发人员手动编写SQL语句,而非完全动态生成。它们同样不需要冗长的映射文件,因为对于维护和调试而言,那些映射文件只会让过程变得单调乏味。

PetaPoco最让人感兴趣的功能包括:

  • 可与SQL Server、SQL Server CE、MySQL、PostgreSQL以及Oracle数据库协同工作。
  • 包含针对Insert/Delete/Update/Save以及IsNew的多个辅助方法。
  • 支持简单事务
  • 对于翻页请求会自动计算总记录数,并获取特定分页。
  • 支持参数替换,能够从对象属性中抓取命名参数(named parameters)
  • 包括一个消耗资源很少的SQL Builder类
  • 部分记录更新
  • 包括T4 Templates,可以用于基于数据库结构生成POCO类。
  • 很好的性能,剔除了Linq,并通过Dynamic方法快速的为属性赋值

在性能方面,PetaPoco仅次于Dapper,速度只稍逊于手工编码的数据访问层(DAL, Data Access Layer)。

PetaPoco下载地址:

  GitHub – https://github.com/toptensoftware/petapoco

  例子:来自PetaPoco官网

 

查询

1.定义Poco 类

// Represents a record in the "articles" table

public class article
{

    public long article_id { get; set; }

    public string title { get; set; }

    public DateTime date_created { get; set; }

    public bool draft { get; set; }

    public string content { get; set; }

}

 

2.创建PetaPoco数据库连接 ,并执行查询

var db=new PetaPoco.Database("connectionStringName");

// 查询所有articles
foreach (var a in db.Query
(SELECT * FROM articles)) { Console.WriteLine({0} – {1}, a.article_id, a.title); }

 

 

查询返回参数

 

long count=db.ExecuteScalar<long>("SELECT Count(*) FROM articles");

 

 

查询得到一行记录

  var a = db.SingleOrDefault
(“SELECT * FROM articles WHERE article_id=0”, 123));

 

分页查询

PetaPoco 自带了分页功能,可以自动执行分页请求。

// <– 1 和 20 分别是页码和每页条数

   var result=db.Page
(1, 20, SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC, coolstuff);
/// PetaPoco 源码中,返回的 Page 对象 的各个属性   
/// /// Holds the results of a paged request. ///

 

/// The type of Poco in the returned result set public class Page { /// /// The current page number contained in this page of result set ///

 

public long CurrentPage { get; set; } /// /// The total number of pages in the full result set ///

 

public long TotalPages { get; set; } /// /// The total number of records in the full result set ///

 

public long TotalItems { get; set; } /// /// The number of items per page ///

 

public long ItemsPerPage { get; set; } /// /// The actual records on this page ///

 

public List Items { get; set; } /// /// User property to hold anything. ///

 

public object Context { get; set; } }


Query vs Fetch

 

Database 对象有两个获取数据的方法:Query 和Fetch。这两个方法非常相似,不同的是Fetch方法返回一个POCO类的List<>,而Query使用 yield return 迭代所有数据,这些数据并没有加载到内存中。

 

  需要注意的是:应该小心再开始一个新的查询之前完成和处理掉上一个查询,否则会曝异常。所以这种情况下, 应该优先使用 Fetch。

 

出现这个问题的时候,一直找不到原因,看了源码注释之后,才知道的。

 

执行非查询的sql 语句

 

使用Execute 方法执行一个不带查询的命令:

db.Execute("DELETE FROM articles WHERE draft<>0");