怎么选择后台管理系统的框架

最近要做一个企业的OA系统,以前一直使用EasyUI,一切都好,但感觉有点土了,想换成现在流行的Bootstrap为基础的后台UI风格,想满足的条件应该达到如下几个:

1、美观、大方、简洁

2、兼容IE8、不考虑兼容IE6/IE7,因为现在还有很多公司在使用Win7系统,系统内置了IE8

3、能通过选项卡打开多个页面,不想做单页,iframe也没关系

4、性能好,不要太笨重

5、最好以Bootstrap为基础

6、还希望在以后别的系统中能够复用。

一次次反复纠结的选择开始了,给大家介绍下我考虑过的UI,也给大家一个参考。

一、EasyUI

easyui是一种基于jQuery的用户界面插件集合。

easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能。

使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面。

easyui是个完美支持HTML5网页的完整框架。

easyui节省您网页开发的时间和规模。

easyui很简单但功能强大的。

优点:轻量、功能强大、免费、兼容性好、帮助详细、使用的人多生态好

缺点:非响应式布局、某些系统看起来有点土(客户与老板的感觉、确实与最新的那些UI有差距)

获得:上网搜索、网盘搜索大把被搭建好了基础功能的框架。下载

下载后大家可以替换成最新的1.5版的easyui

官网:http://www.jeasyui.com/,有免费版,有商业版,商业版收费,帮助非常详尽

资源:http://www.jeasyui.net/,easyui是国人的的作品,但服务器在国外,官网也是英文的,这个网站类似官网的中文版

二、DWZ JUI

特点:DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. 设计目标是简单实用,快速开发,降低ajax开发成本。

官网:http://jui.org/

下载:https://github.com/dwzteam/

三、HUI

H-ui前端框架是在bootstrap的思想基础上基于 HTML、CSS、JAVASCRIPT开发的轻量级web前端框架,开源免费,简单灵活,兼容性好,满足大多数中国网站。分了前端UI与后端UI。

官网:http://www.h-ui.net/H-ui.admin.shtml 后台,http://www.h-ui.net/ 前台

下载:https://github.com/jackying/

缺点:感觉用的人少,名气小,资料不全,配套组件不多,但国人的产品符合国人的口味。

四、BUI

BUI她是基于jQuery,兼容KISSY的UI类库,专致于解决后台系统的框架方案,BUI提供了丰富的DPL含有强大的控件库对业务做了精细的分析。

官网:http://www.builive.com/

下载:https://github.com/dxq613/bui

感觉也比较冷、与HUI有点类似的优点整体框架符合我的要求,但风格有种说不出的感觉。

五、Ace Admin

响应式Bootstrap网站后台管理系统模板ace admin,非常不错的轻量级易用的admin后台管理系统,基于Bootstrap3,拥有强大的功能组件以及UI组件,基本能满足后台管理系统的需求,而且能根据不同设备适配显示,而且还有四个主题可以切换。以前收费,好像最新版不再收费了。

下载:https://github.com/bopoda/ace

官网:http://ace.jeka.by/

感觉比较全,功能强大,组件多,美观,只是用了很多不同的插件,兼容性不错。

兼容的浏览器:

  • Internet Explorer 10
  • Internet Explorer 11
  • Internet Explorer 8
  • Internet Explorer 9
  • Latest Chrome
  • Latest Firefox
  • Latest Opera
  • Latest Safari

使用的插件:

复制代码
jQuery 2.0.3

jQuery UI 1.10.3 (Custom Build)

Twitter Bootstrap 3.0.0

FontAwesome 3.2.1

Google "Open Sans" Font

jQuery Flot Charts 0.8.1

jQuery Sparklines 2.1.2

Easy Pie Chart 1.2.5

jQuery Knob 1.2.0

jQuery Validate 1.11.1

FuelUX 2.3.0 (Spinner & Wizard & Treeview)

FullCalendar 1.6.4

jQuery ColorBox 1.4.27

jQuery dataTables 1.9.4

jQuery Chosen 1.0

jQuery Masked Input 1.3.1

jQuery Input Limiter 1.3.1

jQuery AutoSize 1.17.7

Bootstrap Colorpicker

Bootstrap Datepicker

Bootstrap Timepicker v0.2.3

Bootstrap DateRange Picker 1.2

Bootbox.js 4.0.0

jQuery Gritter 1.7.4

jQuery slimScroll 1.1.1

Spin.js 1.3.0

jQuery UI Touch Punch 0.2.2

Google Code Prettify

ExplorerCanvas

Mindmup Wysiwyg Editor

Toopay Markdown Editor 1.1.4

X-editable 1.4.6

Select2 3.4.2

Bootstrap Tags 2.2.5

jQuery Mobile 1.3.2 (Custom Build)

jqGrid 4.5.2

Dropzone.js 3.0

Nestable lists plugin
复制代码

使用到的插件并没有分开存放,使用起来会麻烦一些。

另外该插件也被很多人简化、修改成选项卡+iframe风格了。

六、Metronic

Metronic 是一套精美的响应式后台管理模板,基于强大的 Twitter Bootstrap 框架实现。Metronic 拥有简洁优雅的 Metro UI 风格界面,6 种颜色可选,76 个模板页面,包括图表、表格、地图、消息中心、监控面板等后台管理项目所需的各种组件。

页面规范、精致、细腻、美观大方;功能强大、非常全;在所有我看到过的基于Bootstrap的网站模版中,Metronic是我认为最优秀的之一,其外观之友好、功能之全面让人惊叹。Metronic 是一个自适应的HTML模版,提供后台管理模版和前端内容网页模版两种风格。

优点:

支持HTML5 和 CSS3
自适应,基于响应式 Twitter Bootstrap框架,同时面向桌面电脑、平板、手机等终端。
整合AngularJS 框架。
可自定义管理面板,包括灵活的布局、主题、导航菜单、侧边栏等。
提供了部分电子商务模块:CMS, CRM, SAAS。
多风格,提供了3个前端风格,7个后端管理面板风格。
简洁扁平风格设计。
700多个网页模版,1500多个UI小组件,100多个表单,80多个jQuery插件。
提供说明文档。

缺点:

太大了,真的不知道从那里开始

对IE的兼容不好,虽然官方声称支持IE8,但我测试结果不支持

收费,今天的价格是$28

七、H+ UI

官网的介绍:H+是一个完全响应式,基于Bootstrap3.3.6最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.4),当然,也集成了很多功能强大,用途广泛的jQuery插件,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。

官网:http://www.zi-han.net/theme/hplus/

与Metronic与INSPINIA非常像,插件非常多,收费998人民币。

八、Admin LTE

AdminLTE 是一个基于Bootstrap 3.x的免费主题,它是一个完全响应式管理模板。高度可定制的,易于使用。适合从小型移动设备到大的台式机很多的屏幕分辨率。

下载:https://github.com/almasaeed2010/AdminLTE (目前star 11652+)

预览: http://almsaeedstudio.com/preview/

官网:Free Bootstrap Admin Template

浏览器支持:
IE 9+
Firefox (latest)
Chrome (latest)
Safari (latest)
Opera (latest)

插件:

复制代码
Boostrap Slider
Ion slider
Bootstrap WYSIHTML5
CKEditor
Bootstrap Colorpicker
Bootstrap Date range Picker
Bootstrap Time Picker
Data Tables
Flot
Morris.js
Sparkilne
Full Calendar
iCheck
jQuery input mask
jQuery Knob
jVector Map
Slim Scroll
Pace
Bootstrap Social Buttons
复制代码

特点:

  • 响应式布局,支持多种设备
  • 打印增强
  • 丰富可排序的面板组件
  • 18个插件与3个自定义插件
  • 轻量、快速
  • 兼容主流浏览器,IE8不兼容
  • 支持Glyphicons, Fontawesome和Ion图标

整体感觉与Metronic类似、功能强大,UI精致,被许多公司使用。

评论中感谢网友(dotNetDR_醉丶千秋)推荐,确定是值得关注的一个UI。

九、INSPINIA

INSPINIA是平面设计理念的管理模板。它是充分响应的由Bootstrap3 +框架开发的模板,HTML5和CSS3。它有很多可重用的UI组件和集成了最新的jQuery插件。它可以用于所有类型的web应用程序自定义管理面板中,项目管理系统,管理仪表板,应用程序的后端,CMS或CRM。

与Metronic一样,风格也比较像,个人认为比Metronic还要强大一些,页面规范、精致、细腻、美观大方;功能强大、非常全;在所有我看到过的基于Bootstrap的网站模版中,Metronic是我认为最优秀的之一,其外观之友好、功能之全面让人惊叹。Metronic 是一个自适应的HTML模版,提供后台管理模版和前端内容网页模版两种风格。

浏览器兼容:

  • IE 9, 10, 11
  • Latest Chrome
  • Latest Firefox
  • Latest Opera
  • Latest Safari

收费,今天的价格是$18。

演示地址:http://wrapbootstrap.com/preview/WB0R5L90S

特点:

相对Metronic他准备了很多个版本,比如:

Static version, AngularJS, ASP.NET MVC5/MVC6, Meteor and Ruby on Rails version

插件很多,但都按引用分文件夹存放了,静态版本中我看了就是48个插件,有PSD源文件,提供的文件包含:

View Code

详细介绍:https://wrapbootstrap.com/theme/inspinia-responsive-admin-theme-WB0R5L90S

十、LigerUI

LigerUI 是基于jQuery 的UI框架,其核心设计目标是快速开发、使用简单、功能强大、轻量级、易扩展。简单而又强大,致力于快速打造Web前端界面解决方案,可以应用于.net,jsp,php等等web服务器环境。

官网:http://www.ligerui.com/

演示:http://www.ligerui.com/demo.html

特点:

使用简单,轻量级
控件实用性强,功能覆盖面大,可以解决大部分企业信息应用的设计场景
快速开发,使用LigerUI可以比传统开发减少极大的代码量
易扩展,包括默认参数、表单/表格编辑器、多语言支持等等
支持Java、.NET、PHP等web服务端
支持 IE6+、Chrome、FireFox等浏览器
开源,源码框架层次简单易懂。

下载:http://pan.baidu.com/s/1o83vRZk

API:         http://api.ligerui.com/

演示地址:  http://demo.ligerui.com/

源码下载:  http://git.oschina.net/ligerui/LigerUI/ (源码托管)

http://pan.baidu.com/s/1D0AVO (V1.2.3)

技术支持: http://www.cnblogs.com/leoxie2011/

个人感觉文档比较全,也有公司的信息系统使用了该UI(去年我去一家公司培训他们就使用该UI,后面上头说要换漂亮些的,他们纠结好久),但整合感觉比不上EasyUI,与DotNet亲一点感觉,DWZ则与Java新一些。

LigerUI中国人开发的、免费。

十一、FineUI

基于 jQuery / ExtJS 的 ASP.NET 控件库、创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序。

该UI也是国人的作品,开源、免费、至今有100多个版本了,个人感觉界面不算难看,控件多,帮助说明也有不少;但只是为ASP.NET量身定做的,有一定的局限性;重,非常重,ExtJS+ASP.NET的页面状态就更加重了。

官网:http://fineui.com/
论坛:http://fineui.com/bbs/
示例:http://fineui.com/demo/
文档:http://fineui.com/doc/
下载:http://fineui.codeplex.com/

十二、其它UI

十三、总结

没有形式就没有内容、UI重要,特别是当客户与老板不懂太多关于代码、功能、性能的时候。

上面的UI你也许可以通过各种途径获得,但商业应用请慎重。

想来想去还是拿不定主意,不过有点想法:

1、使用HUI和bootstrap

2、使用EasyUI的框架,内容页使用HUI+BootStrap,iframe选项卡

3、从各个功能强大的页面中拿一些插件过来

JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注。这篇还是继续,因为博主觉得还有几个非常简单、实用的组件,实在不愿自己一人独享,没办法,谁让博主这么爱分享呢~~

本文原创地址:http://www.cnblogs.com/landeanfen/p/5603790.html

七、多值输入组件manifest

关于文本框的多值输入,一直是一个比较常见的需求,今天博主推荐一款好用的多值输入组件给大家,不要谢我,请叫我“红领巾”!

1、效果展示

本地多值输入框

远程多值输入框

2、源码说明

感谢开源社区,感谢那些喜欢分享的可爱的人儿。开源地址

3、代码示例

(1)本地多值输入

首先需要引用如下几个文件

复制代码
  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/jquery-manifest-master/src/jquery.manifest.css" rel="stylesheet" />

    <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/jquery-manifest-master/build/parts/jquery.ui.widget.js"></script>
    <script src="~/Content/jquery-manifest-master/build/jquery.manifest.js"></script>
复制代码

bootstrap的Js和css文件并非必须,本文是为了样式好看,所以将其引用进来。manifest组件不依赖bootstrap,但是依赖jQuery,除此之外还需要引用jquery.manifest.css、jquery.ui.widget.js、jquery.marcopolo.js三个文件。

然后就是html和js的初始化

<input type='text' autocomplete="off" id="txt_man" />
<script type="text/javascript">
    $(function () {
        $('#txt_man').manifest();
    });
</script>

通过简单如上简单的步骤,上面的效果就可出来,是不是很简单。简单来看看它的一些用法

复制代码
     //常用属性:得到文本框里面所有项的集合
        var values = $('#txt_man').manifest('values');

        //常用方法1:移除最后一项
        $('#txt_man').manifest('remove', ':last');

        //常用方法2:项文本框里面新增一项。第二个参数的格式由JSON数据的格式决定
        $('#txt_man').manifest('add', {
            id: "1",
            name:"ABC"
        });

        //常用方法3:获取远程搜索到的数据的列表
        $('#txt_man').manifest('list');

        //常用事件1:组件的新增项事件
        $('#txt_man').on('manifestadd', function (event, data, $item, initial) {
            //alert("新增的项为:"+data);
        });

        //常用事件2:组件的移除项事件
        $('#txt_man').on('manifestremove', function (event, data, $item) {

        });

        //常用事件3:远程调用时通过键盘选择项变化的事件
        $('#txt_man').on('manifestselect', function (event, data, $item) {

        });
复制代码

(2)远程多值输入

远程搜索输入的方式,需要我们提供一个url地址,获取数据,然后返回到浏览器。本文为了简单,就直接用源码网站上面的url来展示效果了。

首先需要引用的js文件

复制代码
   <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/jquery-manifest-master/src/jquery.manifest.css" rel="stylesheet" />

    <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/jquery-manifest-master/build/parts/jquery.ui.widget.js"></script>
    <script src="~/Content/jquery-manifest-master/build/parts/jquery.marcopolo.js"></script>
    <script src="~/Content/jquery-manifest-master/build/jquery.manifest.js"></script>
复制代码

和上面的相比,多了一个文件jquery.marcopolo.js的引用。

然后就是html和js的初始化

复制代码
          <form action="https://api.foursquare.com/v2/venues/search?callback=?" method="get">
                    <div class="form-group"><div class="col-xs-10">
                            <input type='text' id="txt_man2" />
                            <img src="~/Content/jquery-manifest-master/busy.gif" />
                        </div>
                    </div>
                 </form>
复制代码
复制代码
<script type="text/javascript">
    $(function () {
        $('#txt_man2').manifest({
            formatDisplay: function (data, $item, $mpItem) {
                return data.name;
            },
            formatValue: function (data, $value, $item, $mpItem) {
                return data.id;
            },
            marcoPolo: {
                data: {
                    client_id: 'NO2MTQVBQANW3Q3SG23OFVMEGYOWIZDT4E1QHRPZO0BFCN4X',
                    client_secret: 'LG2WRKKS1SXZ2FMKDG01LDW1KDTEKKTULMXM0XEVWRN0LLHB',
                    intent: 'global',
                    limit: 5,
                    v: '20150601'
                },
                formatData: function (data) {
                    return data.response.venues;
                },
                formatItem: function (data, $item) {
                    return data.name;
                },
                minChars: 3,
                param: 'query'
            },
            required: true
        });
    });
    </script>
复制代码

至于每一个参数的意义,园友们有需要可以研究下,应该不难理解。博主简单监视了一下这个远程搜索方法的返回值

如果有园友打算自己用这个远程的方法,可以参考这个数据格式去实现。

八、文本框搜索组件bootstrap-typeahead

其实关于文本框搜索的功能,很多组件都带有这个功能,比如原来博主用过的jQuery UI里面就有一个autocomplete组件可以实现自动完成。而bootstrap文本框的自动搜索组件,网上也是层出不穷,今天之所以选择这个组件是因为觉得它和bootstrap的风格比较类似,而且组件比较小,简单实用。

1、效果展示

本地静态搜索(数据源在本地)

远程搜索(数据源通过ajax请求远程获取)

2、源码说明

源码地址

3、代码示例

首先需要引用的文件:主要包含一个css和一个js文件。需要jQuery和bootstrap的支持。

  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/twitter-bootstrap-typeahead-master/twitter-bootstrap-typeahead-master/demo/css/prettify.css" rel="stylesheet" />

    <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/twitter-bootstrap-typeahead-master/twitter-bootstrap-typeahead-master/js/bootstrap-typeahead.js"></script>

然后组件的初始化

<input type='text' class="form-control" id="txt_man" />

数据源在本地

复制代码
<script type="text/javascript">
        $(function () {
            $("#txt_man").typeahead({
                source: [
                { key: 1, value: 'Toronto' },
                { key: 2, value: 'Montreal' },
                { key: 3, value: 'New York' },
                { key: 4, value: 'Buffalo' },
                { key: 5, value: 'Boston' },
                { key: 6, value: 'Columbus' },
                { key: 7, value: 'Dallas' },
                { key: 8, value: 'Vancouver' },
                { key: 9, value: 'Seattle' },
                { key: 10, value: 'Los Angeles' }
                ],
                display: "value",
                val:"key"
            });
        });
    </script>
复制代码

数据源通过ajax请求获取

复制代码
<script type="text/javascript">
        $(function () {
            $("#txt_man").typeahead({
                ajax: {
                    url: '/Home2/TypeaheadData',
                    timeout: 300,
                    method: 'post',
                    triggerLength: 1,
                    loadingClass: null,
                    displayField: null,
                    preDispatch: null,
                    preProcess: null
                },
                display: "value",
                val:"key"
            });
        });
    </script>
复制代码

后台对应的测试方法

复制代码
     public JsonResult TypeaheadData()
        {
            var lstRes = new List<object>();
            for (var i = 0; i < 20; i++)
                lstRes.Add(new { key = i, value = Guid.NewGuid().ToString().Substring(0, 4) });

            return Json(lstRes, JsonRequestBehavior.AllowGet) ;
        }
复制代码

常用属性:

  • display:显示的字段名称
  • val:实际的值
  • items:搜索结果默认展示的个数。默认值为8
  • source:本地数据源,格式为数组。
  • ajax:ajax请求的对象,可以直接为一个string的url,也可是object对象。如果是object对象,url这个就不说了,triggerLength的属性表示输入几个字符触发搜索。

常用事件:

  • itemSelected:选中搜索值的时候触发。
复制代码
    <script type="text/javascript">
        $(function () {
            $("#txt_man").typeahead({
                ajax: {
                    url: '/Home2/TypeaheadData',
                    timeout: 300,
                    method: 'post',
                    triggerLength: 1,
                    loadingClass: null,
                    displayField: null,
                    preDispatch: null,
                    preProcess: null
                },
                display: "value",
                val: "key",
                itemSelected: function (item, val, text) {

                }
            });
        });
    </script>
复制代码

参数item表示选中的对象,参数val表示选中项的实际值,text表示选中项的显示值。

九、bootstrap步骤组件

关于bootstrap步骤组件,上篇介绍过一个ystep这个小组件,它在查看任务的进度方面能起到一定的作用,但是对于一些复杂的业务,需要按照当前的步骤处理相应的业务这个方面它就有点无能为力了。今天博主就介绍一款效果相当不错的步骤组件,有了这个组件,程序员再也不用担心复杂的步骤设计了。

1、效果展示

一睹风采

按照步骤进行“上一步”、“下一步”

更多步骤

2、源码说明

这个组件是博主在网上找到的,看了下很多的样式和用法都是bootstrap里面的,唯一需要引用一个js和一个css文件。暂时未找到源码出处,如果有知道源码出处的可以告诉博主,博主再加上,为了尊重作者的劳动成果博主一定尊重原创!

3、代码示例

需要引用的文件

  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/bootstrap-step/css/bs-is-fun.css" rel="stylesheet" />

  <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/bootstrap-step/js/brush.js"></script>

bs-is-fun.css和brush.js这两个文件需要引用,组件需要jQuery和bootstrap的支持。

然后就是组件的初始化。

(1)箭头

复制代码
<ul class="nav nav-pills nav-justified step step-arrow">
    <li class="active">
        <a>step1</a>
    </li>
    <li class="active">
        <a>step2</a>
    </li>
    <li>
        <a>step3</a>
    </li>
</ul>
复制代码

如果是静态的步骤,只需要以上一段html代码即可看到上图中的箭头步骤效果。这里的active样式表示步骤已经经过的样式。

(2)正方形

复制代码
<ul class="nav nav-pills nav-justified step step-square">
    <li class="active">
        <a>step1</a>
    </li>
    <li>
        <a>step2</a>
    </li>
    <li>
        <a>step3</a>
    </li>
</ul>
复制代码

(3)圆形

复制代码
<ul class="nav nav-pills nav-justified step step-round">
    <li class="active">
        <a>step1</a>
    </li>
    <li class="active">
        <a>step2</a>
    </li>
    <li class="active">
        <a>step3</a>
    </li>
</ul>
复制代码

(4)进度条

复制代码
<ul class="nav nav-pills nav-justified step step-progress">
    <li class="active">
        <a>step1<span class="caret"></span></a>
    </li>
    <li class="active">
        <a>step2<span class="caret"></span></a>
    </li>
    <li>
        <a>step3<span class="caret"></span></a>
    </li>
    <li>
        <a>step4<span class="caret"></span></a>
    </li>
    <li>
        <a>step5<span class="caret"></span></a>
    </li>
    <li>
        <a>step6<span class="caret"></span></a>
    </li>
</ul>
复制代码

(5)上一步、下一步

上图中的“上一步”、“下一步”是在bootstrap的modal组件里面自己定义的,还是把代码贴出来,供大家参考。

复制代码
<div class="modal fade" id="myModalNext">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title">选项配置</h4><ul class="nav nav-pills nav-justified step step-progress">
                        <li class="active">
                            <a>步骤一<span class="caret"></span></a>
                        </li>
                        <li>
                            <a>步骤二<span class="caret"></span></a>
                        </li>
                        <li>
                            <a>步骤三<span class="caret"></span></a>
                        </li>
                        <li>
                            <a>步骤四<span class="caret"></span></a>
                        </li>
                        <li>
                            <a>步骤五<span class="caret"></span></a>
                        </li>
                        <li>
                            <a>步骤六<span class="caret"></span></a>
                        </li>
                    </ul>
                </div>
                <div class="modal-body">
                    <div class="container-fluid">
                        <div class="carousel slide" data-ride="carousel" data-interval="false" data-wrap="false">
                            <div class="carousel-inner" role="listbox">
                                <div class="item active">
                                    <p>步骤一</p>
                                    <div class="col-xs-2">
                                        配置角色
                                    </div>
                                    <div class="col-xs-4">
                                        <input type="text" class="form-control" />
                                    </div>
                                    <div class=" col-xs-4">
                                        <button type="button" class=" btn btn-primary">保存</button>
                                    </div>
                                </div>
                                <div class="item">
                                    <p>步骤二</p>
                                    <div class="col-xs-2">
                                        配置用户
                                    </div>
                                    <div class="col-xs-4">
                                        <input type="text" class="form-control" />
                                    </div>
                                    <div class=" col-xs-4">
                                        <button type="button" class=" btn btn-primary">保存</button>
                                    </div>
                                </div>
                                <div class="item">
                                    <p>步骤三</p>
                                </div>
                                <div class="item">
                                    <p>步骤四</p>
                                </div>
                                <div class="item">
                                    <p>步骤五</p>
                                </div>
                                <div class="item">
                                    <p>步骤六</p>
                                </div>
                            </div>
                        </div>
                    </div>

                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default MN-pre">上一步</button>
                    <button type="button" class="btn btn-primary MN-next">下一步</button>
                </div>
            </div>
        </div>
    </div>
复制代码

当然,还需要注册两个按钮的点击事件

复制代码
      $("#myModalNext .modal-footer button").each(function () {
            $(this).click(function () {
                if ($(this).hasClass("MN-next")) {
                    $("#myModalNext .carousel").carousel('next');
                    $("#myModalNext .step li.active").next().addClass("active");
                } else {
                    $("#myModalNext .carousel").carousel('prev');
                    if ($("#myModalNext .step li").length > 1) {
                        $($($("#myModalNext .step li.active"))[$("#myModalNext .step li.active").length - 1]).removeClass("active")
                    }
                }
            })
        })
复制代码

逻辑可能并不完善,如果正式使用需要测试。

十、按钮加载组件ladda-bootstrap

关于按钮加载,博主早就想找一个合适的组件去优化,如果不处理,肯定存在重复操作的可能。今天来看下这么一个小东西吧。

1、效果展示

初见

自定义颜色、大小、进度条

2、源码说明

源码地址

3、代码示例

需要引用的文件

复制代码
  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/ladda-bootstrap-master/ladda-bootstrap-master/dist/ladda-themeless.min.css" rel="stylesheet" />

  <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/ladda-bootstrap-master/ladda-bootstrap-master/dist/spin.min.js"></script>
    <script src="~/Content/ladda-bootstrap-master/ladda-bootstrap-master/dist/ladda.min.js"></script>
复制代码

组件初始化:初始化4个按钮

<button class="btn btn-primary ladda-button" data-style="expand-left"><span class="ladda-label">expand-left</span></button>
<button class="btn btn-primary ladda-button" data-style="expand-right"><span class="ladda-label">expand-right</span></button>
<button class="btn btn-primary ladda-button" data-style="zoom-in"><span class="ladda-label">zoom-in</span></button>
<button class="btn btn-primary ladda-button" data-style="zoom-out"><span class="ladda-label">zoom-out</span></button>
复制代码
      $(function () {
            $('button').click(function (e) {
                e.preventDefault();
                var l = Ladda.create(this);
                l.start();
                l.setProgress(0 - 1);
                $.post("/Home2/TypeaheadData",{ },
                  function (data,statu) {
                      console.log(statu);
                  }, "json");
                .always(function () { l.stop(); });
                return false;
            });
        });
复制代码

代码释疑:应该不难理解,初始化组件主要涉及的代码 var l = Ladda.create(this);   l.start(); ,这里的this表示当前点击的按钮的对象(注意这里是dom对象而不是jQuery对象),然后请求结束后调用 l.stop(); 关闭加载。

(1)data-style所有选项如下,有兴趣可以去试试,看看都是些什么效果:

复制代码
data-style="expand-left"
data-style="expand-right"
data-style="expand-up"
data-style="expand-down"
data-style="zoom-in"
data-style="zoom-out"
data-style="slide-left"
data-style="slide-right"
data-style="slide-up"
data-style="slide-down"
data-style="contract"
复制代码

(2)如果需要调整按钮的大小,组件内置了data-size属性,data-size所有选项如下:

data-size="xs"
data-size="s"
data-size="l"

(3)如果需要设置按钮的颜色,通过data-spinner-color

data-spinner-color="#FF0000"

(4)按钮的进度条的设置

复制代码
    Ladda.bind('button', {
                callback: function (instance) {
                    var progress = 0;
                    var interval = setInterval(function () {
                        progress = Math.min(progress + Math.random() * 0.1, 1);
                        instance.setProgress(progress);
                        if (progress === 1) {
                            instance.stop();
                            clearInterval(interval);
                        }
                    }, 200);
                }
            });
        });
复制代码

主要通过instance.setProgress(progress);这一句来设置当前执行的进度,progress的取值在0到1之间。当然,以上只是测试进度效果的代码,在正式项目中这里需要计算当前请求执行的情况来动态返回进度。

十一、开关组件bootstrap-switch

在bootstrap中文网的首页上面,你就能找到这么一个组件

1、效果展示

初始效果

五花八门的属性以及事件

2、源码说明

Bootstrap-Switch源码地址:https://github.com/nostalgiaz/bootstrap-switch

Bootstrap-Switch文档以及Demo:http://www.bootstrap-switch.org/examples.html

3、代码示例

需要引用的文件

  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/bootstrap-switch-master/bootstrap-switch-master/dist/css/bootstrap3/bootstrap-switch.css" rel="stylesheet" />

    <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap/js/bootstrap.js"></script>
    <script src="~/Content/bootstrap-switch-master/bootstrap-switch-master/dist/js/bootstrap-switch.js"></script>

组件依赖于JQuery和bootstrap

然后就是和html和js的初始化

<input type="checkbox" checked />
$(function () {
    $('input[type=checkbox]').bootstrapSwitch({ size: "large" });
})

size属性并非必须,如果你使用默认的样式,参数可以不传。

常用的属性

  • size:开关大小。可选值有’mini’, ‘small’, ‘normal’, ‘large’
  • onColor:开关中开按钮的颜色。可选值有’primary’, ‘info’, ‘success’, ‘warning’, ‘danger’, ‘default’
  • offColor:开关中关按钮的颜色。可选值’primary’, ‘info’, ‘success’, ‘warning’, ‘danger’, ‘default’
  • onText:开关中开按钮的文本,默认是“ON”。
  • offText:开关中关按钮的文本,默认是“OFF”。
  • onInit:初始化组件的事件。
  • onSwitchChange:开关变化时的事件。

常用的事件和方法可以直接查看文档,官方提供了很详细的说明。

十二、评分组件bootstrap-star-rating

某东、某宝上面的评分大家应该都有了解,无意中发现了一块bootstrap风格的评分组件,觉得有点意思,以后做电商、社区、论坛系统或许用得着,就来分享分享。

1、效果展示

2、源码说明

源码下载

3、代码示例

此组件需要jQuery和bootstrap样式的支持

  <link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="~/Content/bootstrap-star-rating-master/bootstrap-star-rating-master/css/star-rating.css" rel="stylesheet" />

    <script src="~/Content/jquery-1.9.1.js"></script>
    <script src="~/Content/bootstrap-star-rating-master/bootstrap-star-rating-master/js/star-rating.js"></script>
    <script src="~/Content/bootstrap-star-rating-master/bootstrap-star-rating-master/js/locales/zh.js"></script>

直接通过html初始组件

复制代码
<input id="input-2b" type="number" class="rating" min="0" max="5" step="0.5" data-size="xl"
                   data-symbol="&#xe005;" data-default-caption="{rating} hearts" data-star-captions="{}">
<input id="input-21a" value="0" type="number" class="rating" min=0 max=5 step=0.5 data-size="xl">
<input id="input-21b" value="4" type="number" class="rating" min=0 max=5 step=0.2 data-size="lg">
<input id="input-21c" value="0" type="number" class="rating" min=0 max=8 step=0.5 data-size="xl" data-stars="8">
<input id="input-21d" value="2" type="number" class="rating" min=0 max=5 step=0.5 data-size="sm">
<input id="input-21e" value="0" type="number" class="rating" min=0 max=5 step=0.5 data-size="xs">
<input id="input-21f" value="0" type="number" class="rating" min=0 max=5 step=0.5 data-size="md">
<input id="input-2ba" type="number" class="rating" min="0" max="5" step="0.5" data-stars=5
                   data-symbol="&#xe005;" data-default-caption="{rating} hearts" data-star-captions="{}">
<input id="input-22" value="0" type="number" class="rating" min=0 max=5 step=0.5 data-rtl=1 data-container-class='text-right' data-glyphicon=0>
复制代码

组件通过class=”rating”这一个来进行初始化。这里几个参数应该很好理解:

  • value:表示组件初始化的时候默认的分数
  • min:最小分数
  • max:最大分数
  • step:每次增加的最小刻度
  • data-size:星星的大小
  • data-stars:星星的个数

通过 $(“#input-21a”).val() 即可得到当前的评分数。

十三、总结

通过这两篇给大家分享了下bootstrap的十二款组件,博主相信这些里面肯定有些你能够用上,可能有些并不常用,但留着以后或许能用上呢!至此,bootstrap组件的总结暂时告一段落,后面将会分享下ko的一些封装。如果你觉得本文能够帮到你,可以推荐下,博主一定继续努力!

欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利

30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。

本系列【T-SQL基础】主要是针对T-SQL基础的总结。

【T-SQL基础】01.单表查询-几道sql查询题

【T-SQL基础】02.联接查询

【T-SQL基础】03.子查询

【T-SQL基础】04.表表达式-上篇

【T-SQL基础】04.表表达式-下篇

【T-SQL基础】05.集合运算

【T-SQL基础】06.透视、逆透视、分组集

【T-SQL基础】07.数据修改

【T-SQL基础】08.事务和并发

【T-SQL基础】09.可编程对象

———————————————————-

【T-SQL性能调优】01.索引优化

【T-SQL性能调优】02.执行计划

【T-SQL性能调优】03.死锁分析

回到顶部

概述:

本篇主要是对SQL中事务和并发的详细讲解。

回到顶部

一、事务

1.什么是事务

为单个工作单元而执行的一系列操作。如查询、修改数据、修改数据定义。

2.语法

(1)显示定义事务的开始、提交

1
2
3
4
BEGIN TRAN
INSERT INTO b(t1) VALUES(1)
INSERT INTO b(t1) VALUES(2)
COMMIT TRAN

(2)隐式定义

如果不显示定义事务的边界,则SQL Server会默认把每个单独的语句作为一个事务,即在执行完每个语句之后就会自动提交事务。

3.事务的四个属性ACID

(1)原子性Atomicity

1.事务必须是原子工作单元。事务中进行的修改,要么全部执行,要么全都不执行;

2.在事务完成之前(提交指令被记录到事务日志之前),系统出现故障或重新启动,SQL Server将会撤销在事务中进行的所有修改;

3.事务在处理中遇到错误,SQL Server通常会自动回滚事务;

4.少数不太严重的错误不会引发事务的自动回滚,如主键冲突、锁超时等;

5.可以使用错误处理来捕获第4点提到的错误,并采取某种操作,如把错误记录在日志中,再回滚事务;

6.SELECT @@TRANCOUNT可用在代码的任何位置来判断当前使用SELECT @@TRANCOUNT的地方是否位于一个打开的事务当中,如果不在任何打开的事务范围内,则该函数返回0;如果在某个打开的事务返回范围内,则返回一个大于0的值。打开一个事务,@@TRANCOUNT=@@TRANCOUNT+1;提交一个事务,@@TRANCOUNT-1。

 

(2)一致性Consiitency

1.同时发生的事务在修改和查询数据时不发生冲突;

2.一致性取决于应用程序的需要。后面会讲到一致性级别,以及如何对一致性进行控制。

 

(3)隔离性Isolation

1.用于控制数据访问,确保事务只访问处于期望的一致性级别下的数据;

2.使用锁对各个事务之间正在修改和查询的数据进行隔离。

 

(4)持久性Durability

1.在将数据修改写入到磁盘上数据库的数据分区之前会把这些修改写入到磁盘上数据库的事务日志中,把提交指令记录到磁盘的事务日志中以后,及时数据修改还没有应用到磁盘的数据分区,也可以认为事务时持久化的。

2.系统重新启动(正常启动或在发生系统故障之后启动),SQL Server会每个数据库的事务日志,进行回复处理。

3.恢复处理包含两个阶段:重做阶段和撤销阶段。

4.前滚:在重做阶段,对于提交指令已经写入到日志的事务,但数据修改还没有应用到数据分区的事务,数据库引擎会重做这些食物所做的所有修改。

5.回滚:在撤销阶段,对于提交指令没有写入到日志中的事务,数据库引擎会撤销这些事务所做的修改。(这句话需要research,可能是不正确的。因为提交指令没有写入到数据分区,撤销修改是指撤销哪些修改呢???)

 

回到顶部

二、锁

1.事务中的锁

(1)SQL Server使用锁来实现事务的隔离。

(2)事务获取锁这种控制资源,用于保护数据资源,防止其他事务对数据进行冲突的或不兼容的访问。

2.锁模式

(1)排他锁

a.当试图修改数据时,事务只能为所依赖的数据资源请求排他锁。

b.持有排他锁时间:一旦某个事务得到了排他锁,则这个事务将一直持有排他锁直到事务完成。

c.排他锁和其他任何类型的锁在多事务中不能在同一阶段作用于同一个资源。

如:当前事务获得了某个资源的排他锁,则其他事务不能获得该资源的任何其他类型的锁。其他事务获得了某个资源的任何其他类型的锁,则当前事务不能获得该资源的排他锁。

(2)共享锁

a.当试图读取数据时,事务默认会为所依赖的数据资源请求共享锁。

b.持有共享锁时间:从事务得到共享锁到读操作完成。

c.多个事务可以在同一阶段用共享锁作用于同一数据资源。

d.在读取数据时,可以对如何处理锁定进行控制。后面隔离级别会讲到如何对锁定进行控制。

3.排他锁和共享锁的兼容性

(1)如果数据正在由一个事务进行修改,则其他事务既不能修改该数据,也不能读取(至少默认不能)该数据,直到第一个事务完成。

(2)如果数据正在由一个事务读取,则其他事务不能修改该数据(至少默认不能)。

4.可锁定的资源的类型

RID、KEY(行)、PAGE(页)、对象(例如表)、数据库、EXTENT(区)、分配单元(ALLOCATION_UNIT)、堆(HEAP)、以及B树(B-tree)。

RID: 标识页上的特定行
格式: fileid: pagenumber: rid (1:109:0 )
其中fileid标识包含页的文件, pagenumber标识包含行的页,rid标识页上的特定行。
fileid与sys.databases_files 目录视图中的file_id列相匹配
例子:
在查询视图sys.dm_tran_locks的时候有一行的resource_description列显示RID 是1:109:0 而status列显示wait,
表示第1个数据文件上的第109页上的第0行上的锁资源。

5.锁升级

SQL Server可以先获得细粒度的锁(例如行或页),在某些情况下将细粒度锁升级为更粗粒度的锁(例如,表)。
例如单个语句获得至少5000个锁,就会触发锁升级,如果由于锁冲突而导致无法升级锁,则SQL Server每当获取1250个新锁时出发锁升级。

回到顶部

三、阻塞

1.阻塞

当多个事务都需要对某一资源进行锁定时,默认情况下会发生阻塞。被阻塞的请求会一直等待,直到原来的事务释放相关的锁。锁定超时期限可以限制,这样就可以限制被阻塞的请求在超时之前要等待的时间。

阶段1:事务A请求资源S1,事务不对资源S1进行操作

阶段2:事务A用锁A锁定资源S1,事务B请求对资源S1进行不兼容的锁定(锁B),锁B的请求被阻塞,事务B将进入等待状态

阶段3:事务A正在释放锁A,事务B等待锁A释放,

阶段4:事务A的锁A已释放,事务B用锁B锁定资源S1

 

2.排除阻塞

例子:

(1)准备工作:

1.准备测试数据

1
2
3
4
5
6
7
8
--先创建一张表Product作为测试。id为表的主键,price为product的价格
CREATE TABLE [dbo].[myProduct](
    [id] [int] NOT NULL,
    [price] [money] NOT NULL
) ON [PRIMARY]
GO
--插入一条数据,id=1,price=10
INSERT INTO [TSQLFundamentals2008].[dbo].[myProduct]([id],[price])VALUES(1,10)

2.模拟阻塞发生的情况

在SQL Server中打开三个查询窗口Connection1、Connection2、Connection3,分别按顺序执行表格中的执行语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--Connection1
BEGIN TRAN
UPDATE dbo.myProduct SET price = price + 1 WHERE id=1
 
--Connection2
SELECT * FROM dbo.myProduct WHERE id=1
 
--Connection3
SELECT  request_session_id AS 会话id ,
        resource_type AS 请求锁定的资源类型 ,
        resource_description AS 描述 ,
        request_mode AS 模式 ,
        request_status AS 状态
FROM    sys.dm_tran_locks
查询窗口服务器进程标识符SPID 执行语句结果说明
 Connection152
1
2
3
4
5
--语句1:
BEGIN TRAN
UPDATE dbo.myProduct SET price = price + 1 WHERE id=1
更新产品价格10.00->11.00

 

 为了更新id=1这一行数据,会话必须先获得一个排他锁。事务处于一直打开状态,没有提交,所以事务一直持有排他锁,直到事务提交并完成。
 Connection256
1
2
--语句2:
SELECT * FROM dbo.myProduct WHERE id=1

 

 事务为了读取数据,需要请求一个共享锁,但是这一行已经被其他会话持有的排他锁锁定,而且共享锁和排他锁不是兼容的,所以会话被阻塞,进入等待状态
 Connection357
1
2
3
4
5
6
7
--语句3:
SELECT request_session_id AS 会话id ,
resource_type AS 请求锁定的资源类型 ,
resource_description AS 描述 ,
request_mode AS 模式 ,
request_status AS 状态
FROM sys.dm_tran_locks

 

 会话56:
(1)状态WAIT-等待锁
(2)正在等待第1个数据文件上的第109页上的第0行资源的共享锁
(3)持有第1个数据文件上的第109页资源的意向共享锁
(3)持有OBJECT资源,意向共享锁
(4)持有DATABASE资源,意向共享锁
会话52:
(1)状态WAIT-授予锁
(2)正在等待第1个数据文件上的第109页上的第0行资源的排他锁(3)持有第1个数据文件上的第109页资源的排他锁
(3)持有OBJECT资源,排他锁
(4)持有DATABASE资源,排他锁

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2)分析阻塞

★ 1.sys.dm_tran_locks 视图

(1)该动态视图可以查询出哪些资源被哪个进程ID锁了

(2)查询出对资源授予或正在等待的锁模式

(3)查询出被锁定资源的类型

上面的查询语句3已经用到了这个视图,可以参考上图中的分析说明。

 

★ 2.sys.dm_exec_connections 视图

(1)查询出该动态视图可以查询出进程相关的信息

(2)查询出最后一次发生读操作和写操作的时间last_read,last_write

(3)查询出进程执行的最后一个SQL批处理的二进制标记most_recent_sql_handle

查询窗口服务器进程标识符SPID 执行语句结果说明
 Connection357
1
2
3
4
5
6
7
8
SELECT  session_id ,
        connect_time ,
        last_read ,
        last_write ,
        most_recent_sql_handle
FROM    sys.dm_exec_connections
WHERE   session_id IN ( 52, 56 )

 

 

 

会话52:
(1)connect_time连接时间:2016-06-07 07:09:41.103
(2)last_read最后一次读操作时间:2016-06-07 07:10:56.233
(3)last_write最后一次写操作时间:2016-06-07 07:10:57.873
(4)most_recent_sql_handle这是一个二进制标记,最后一个SQL批处理

会话56:
(1)状态WAIT-授予锁
(2)正在等待第1个数据文件上的第109页上的第0行资源的排他锁(3)持有第1个数据文件上的第109页资源的排他锁
(3)持有OBJECT资源,排他锁
(4)持有DATABASE资源,排他锁

 

 

 

 

 

 

 

 

 

 

★ 3.sys.dm_exec_sql_text 表函数

(1)该函数可以将二进制标记most_recent_sql_handle作为参数,然后返回SQL代码。

(2)阻塞进程在不断地运行,所以在代码中看到的最后一个操作不一定是导致问题的语句。在本例中最后一条执行语句是导致阻塞的语句。

查询窗口服务器进程标识符SPID执行语句结果说明
 Connection3 57
1
2
3
4
5
6
SELECT  session_id ,
        text
FROM    sys.dm_exec_connections
        CROSS APPLY sys.dm_exec_sql_text
        (most_recent_sql_handle) AS ST
WHERE   session_id IN ( 52, 56 )

 

会话52:
执行的SQL语句:

1
2
3
4
BEGIN TRAN
UPDATE dbo.myProduct
SET price = price + 1
WHERE id = 1

会话56:
执行的SQL语句:

1
2
3
(@1 tinyint)
SELECT * FROM [dbo].[myProduct]
WHERE [id]=@1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

★ 4.sys.dm_exec_sessions 视图

(1)会话建立的时间login_time

(2)特定于会话的客户端工作站名称host_name

(3)初始化会话的客户端程序的名称program_name

(4)会话所使用的SQL Server登录名login_name

(5)最近一次会话请求的开始时间last_request_start_time

(6)最近一次会话请求的完成时间last_request_end_time

查询窗口服务器进程标识符SPID 执行语句结果说明
 Connection357
1
SELECT * FROM sys.dm_exec_sessions
 

 

 

 

 

 

 

 

 

 

 

 

★ 5.sys.dm_exec_requests 视图

(1)识别出阻塞链涉及到的会话、争用的资源、被阻塞会话等待了多长时间

查询窗口服务器进程标识符SPID 执行语句结果说明
 Connection357
1
SELECT * FROM sys.dm_exec_sessions
 

 

会话56:
(1)被会话52阻塞,blocking_session_id = 52
(2)会话52的开始时间start_time
(3)状态挂起status = suspended
(4)挂起的命令command=select

 

 

 

 

 

 

 

 

 

★ 6.Lock_TIMEOUT 选项

(1)设置会话等待锁释放的超时期限

(2)默认情况下会话不会设置等待锁释放的超时期限

(3)设置会话超时期限为5秒, SET Lock_TIMEOUT 5000

(4)锁定如果超时,不会引发事务回滚

(5)取消会话超时锁定的设置,SET LOCK_TIMEOUT -1

如果超时,将显示以下错误:

 

7.KILL <spid> 命令

(1)杀掉会话52,KILL 52

(2)杀掉会话,会引起事务回滚,同时释放排他锁

回到顶部

三、隔离级别

1.基本概念:

(1)隔离级别用来做什么

a.隔离级别用于决定如何控制并发用户读写数据的操作

(2)写操作
a.任何对表做出修改的语句

b.使用排他锁

c.不能修改读操作获得的锁和锁的持续时间

(3)读操作:

a.任何检索数据的语句

b.默认使用共享锁

c.使用隔离级别来控制读操作的处理方式

2.隔离级别的分类

(1)未提交读 (READ UNCOMMITTED)

(2)已提交读(READ COMMITTED)(默认值)

(3)可重复读(REPEATABLE READ)

(4)可序列化(SERIALIZABLE)

(5)快照(SNAPSHOT)

(6)已经提交读快照(READ_COMMITTED_SNAPSHOT)

3.隔离级别的设置

(1)设置整个会话的隔离级别

1
SET TRANSACTION ISOLATION LEVEL <isolation name>;
1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

(2)用表提示设置查询的隔离级别

1
2
SELECT ... FROM <table> WITH (<isolation name>);<br>
SELECT * FROM dbo.myProduct WITH (READCOMMITTED);
注意:

1.设置会话选项的隔离级别时,隔离级别中的每个单词之间需要用空格分隔

2.用表提示的隔离级别时,隔离级别中的每个单词之间不需要用空格分隔

3.表提示的隔离级别有同义词,如:NOLOCK->READUNCOMMITTED,HOLDLOCK->REPEATABLEREAD

4.隔离级别的严格性:1.未提交读<2.已提交读<3.可重复读<4.可序列化

5.隔离级别越高,一致性越高,并发性越低

6.基于快照的隔离级别,SQL Server将提交过的行保存到tempdb数据库中,当读操作发现行的当前版本和它们预期的不一致时,可以立即得到行的以前版本,从而不用请求共享锁也能取得预期的一致性。

4.隔离级别的行为方式

★ 1.未提交读 (READ UNCOMMITTED)

打开两个查询窗口,Connetion1,connection2

Step1: 执行Connection1的阶段2的SQL 语句,然后执行connection2的SQL语句

Step2: 执行Connection1的阶段3的SQL 语句,执行connection2的SQL语句

Step3: 执行Connection1的阶段4的SQL 语句,执行connection2的SQL语句

查询窗口事务 执行语句
Connetion1A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--阶段2
UPDATE  myProduct
SET     price = price + 1
WHERE   id = 1;
 
SELECT  id ,
        price
FROM    dbo.myProduct
WHERE   id = 1;
 
--阶段3
UPDATE  myProduct
SET     price = price + 5
WHERE   id = 1;
 
SELECT  id ,
        price
FROM    dbo.myProduct
WHERE   id = 1;
 
--阶段4
COMMIT TRAN

 

Connection2B
1
2
3
4
5
6
7
8
9
--在阶段2执行之后
SET TRAN ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN;
SELECT  id ,
        price
FROM    dbo.myProduct
WHERE   id = 1
COMMIT TRAN;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

两个事务的流程图:

 

 

阶段1:Price=10,事务A对myProduct表请求排他锁

阶段2:事务A对myProduct表使用了排他锁,更新price = price + 1,然后事务A查询price的价格: price=11。事务B不请求任何锁,事务B在A更新Price之后进行查询,price=11

阶段3:事务A更新price = price + 5,然后事务A查询price的价格,price = 16。事务B查询price的价格: price=16

阶段4:事务A释放排他锁

阶段5:事务A中查询price的价格:price = 16。事务B查询price的价格: price=16

大家可以看到事务B有两种结果,这就是“未提交读 (READ UNCOMMITTED)”隔离级别的含义:

(1)读操作可以读取未提交的修改(也称为脏读)。

(2)读操作不会妨碍写操作请求排他锁,其他事务正在进行读操作时,写操作可以同时对这些数据进行修改。

(3)事务A进行了多次修改,事务B在不同阶段进行查询时可能会有不同的结果。

 

★ 2.已提交读(READ COMMITTED)(默认值)
打开两个查询窗口,Connetion1,connection2

Step1: 执行Connection1的SQL 语句

Step2: 执行Connection2的SQL 语句

执行语句执行语句
Connetion1A
1
2
UPDATE dbo.myProduct SET price = price + 1 WHERE id=1
SELECT * FROM dbo.myProduct WHERE id =1

 

Connection2B
1
2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM dbo.myProduct WHERE id = 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

两个事务的流程图:

 

阶段1:Price=10,事务A对myProduct表请求排他锁

阶段2:事务A对myProduct表使用了排他锁,更新price = price + 1,然后事务A查询price的价格: price=11。然后事务B请求共享锁进行读操作,查询price,

由于在当前隔离级别下,事务A的排他锁和事务B的共享锁存在冲突,所以事务B需要等待事务A释放排他锁后才能读取数据。

阶段3:事务A提交事务(COMMIT TRAN)

阶段4:事务A提交完事务后,释放排他锁

阶段5:事务B获得了共享锁,进行读操作,price=11

“已提交读 (READ UNCOMMITTED)”隔离级别的含义:

(1)必须获得共享锁才能进行读操作,其他事务如果对该资源持有排他锁,则共享锁必须等待排他锁释放。

(2)读操作不能读取未提交的修改,读操作读取到的数据是提交过的修改。

(3)读操作不会在事务持续期间内保留共享锁,其他事务可以在两个都操作之间更改数据资源,读操作因而可能每次得到不同的取值。这种现象称为“不可重复读”

 

3.可重复读(REPEATABLE READ)

打开两个查询窗口,Connetion1,connection2

Step1: 执行Connection1的SQL 语句

Step2: 执行Connection2的SQL 语句

 

执行语句事务执行语句
Connetion1A
1
2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SELECT * FROM dbo.myProduct WHERE id = 1
Connection2B
1
UPDATE dbo.myProduct SET price = price + 1 WHERE id=1

 

 

 

 

 

 

两个事务的流程图:

阶段1:Price=10,事务A对myProduct表请求共享锁

阶段2:事务A对myProduct表使用了共享锁,事务A查询price的价格: price=10,事务A一直持有共享锁直到事务A完成为止。然后事务B请求排他锁进行写操作price=price+1,

由于在当前隔离级别下,事务A的共享锁和事务B请求的排他锁存在冲突,所以事务B需要等待事务A释放共享锁后才能修改数据。

阶段3:事务A查询price, price=10, 说明事务B的更新操作被阻塞了,更新操作没有被执行。然后事务A提交事务(COMMIT TRAN)

阶段4:事务A提交完事务后,释放共享锁

阶段5:事务B获得了排他锁,进行写操作,price=11

“可重复读 (REPEATABLE READ)”隔离级别的含义:

(1)必须获得共享锁才能进行读操作,获得的共享锁将一直保持直到事务完成之止。

(2)在获得共享锁的事务完成之前,没有其他事务能够获得排他锁修改这一数据资源,这样可以保证实现可重复的读取。

(3)两个事务在第一次读操作之后都将保留它们获得的共享锁,所以任何一个事务都不能获得为了更新数据而需要的排他锁,这种情况将会导致死锁(deadlock),不过却避免了更新冲突。
★ 4.可序列化(SERIALIZABLE)

打开两个查询窗口,Connetion1,connection2
Step1: 执行Connection1的SQL 语句
Step2: 执行Connection2的SQL 语句

 

执行语句事务
执行语句
Connetion1A
1
2
3
BEGIN TRANSACTION
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT * FROM dbo.myProduct WHERE id = 1
Connection2B
1
INSERT INTO dbo.myProduct(id, price) VALUES (1, 20)

 

 

 

 

 

 

 

两个事务的流程图:

 

阶段1:Price=10,事务A对myProduct表请求共享锁

阶段2:事务A对myProduct表使用了共享锁,事务A查询id=1的price的价格:1行记录,price=10,事务A一直持有共享锁直到事务A完成为止。然后事务B请求排他锁进行插入操作id=1,price=20,

由于在当前隔离级别下,事务B试图增加能够满足事务A的读操作的查询搜索条件的新行,所以事务A的共享锁和事务B请求的排他锁存在冲突,事务B需要等待事务A释放共享锁后才能插入数据。

阶段3:事务A查询出id=1的数据只有1行,说明事务B的插入操作被阻塞了,插入操作没有被执行。然后事务A提交事务(COMMIT TRAN)

阶段4:事务A提交完事务后,释放共享锁

阶段5:事务B获得了排他锁,进行插入操作,插入成功,查询出id=1的数据有两条

“可序列化(SERIALIZABLE)”隔离级别的含义:

(1)必须获得共享锁才能进行读操作,获得的共享锁将一直保持直到事务完成之止。

(2)在获得共享锁的事务完成之前,没有其他事务能够获得排他锁修改这一数据资源,且当其他事务增加能够满足当前事务的读操作的查询搜索条件的新行时,其他事务将会被阻塞,直到当前事务完成然后释放共享锁,其他事务才能获得排他锁进行插入操作。

(3)事务中的读操作在任何情况下读取到的数据是一致的,不会出现幻影行。

(4)范围锁:读操作锁定满足查询搜索条件的整个范围的锁

 

5.隔离级别总结

 

隔离级别是否读取未提交的行是否不可重复读是否丢失更新是否幻读共享锁持续时间是否持有范围锁
未提交读 READ UNCOMMITTEDYYYY当前语句N
已提交读 READ COMMITTEDNYYY当前语句N
可重复读REPEATABLE READNNNY事务开始到事务完成N
可序列化SERIALZABLENNNN事务开始到事务完成Y

 

回到顶部

回到顶部

四.死锁

死锁是指一种进程之间互相永久阻塞的状态,可能涉及两个或更多的进程。

打开两个查询窗口,Connetion1,connection2

Step1: 执行Connection1的SQL 语句

Step2: 执行Connection2的SQL 语句

 

执行语句事务执行语句
Connetion1A
1
2
3
4
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE dbo.myProduct SET price = price + 1 WHERE id=1
SELECT * FROM dbo.myOrder WHERE id =1
Connection2B
1
2
3
4
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN
UPDATE dbo.myOrder SET customer = 'ddd' WHERE id = 1
SELECT * FROM dbo.myProduct WHERE id = 1

 

 

 

 

 

 

 

两个事务的流程图:

阶段1:Price=10,事务A对myProduct表请求排他锁。Customer = aaa,事务B对myOrder请求排他锁

阶段2:事务A对myProduct表使用了排他锁,更新price = price + 1。然后事务B对myOrder表使用了排他锁,更新customer=ddd。

阶段3:事务A查询myOrder表,对myOrder表请求共享锁,因为事务A的请求的共享锁与事务B的排他锁冲突,所以事务A被阻塞。然后事务B查询myProduct表,对myProduct表请求共享锁,因为事务B的请求的共享锁与事务A的排他锁冲突,所以事务B被阻塞。

阶段4:事务A等待事务B的排他锁释放,事务B等待事务A的排他锁释放,导致死锁。事务A和事务B都被阻塞了。

阶段5:SQL Server在几秒之内检测到死锁,会选择一个事务作为死锁的牺牲品,终止这个事务,并回滚这个事务所做的操作。在这个例子中,事务A被终止,提示信息:事务(进程 ID 53)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

“死锁 (Dead Lock)”的一些注意事项:

(1)如果两个事务没有设置死锁优先级,且两个事务进行的工作量也差不多一样时,任何一个事务都由可能被终止。

(2)解除死锁要付出一定的系统开销,因为这个过程会涉及撤销已经执行过的处理。

(3)事务处理的时间时间越长,持有锁的时间就越长,死锁的可能性也就越大,应该尽可能保持事务简短,把逻辑上可以不属于同一个工作单元的操作移到事务以外。

(4)上面的例子中,事务A和事务B以相反顺序访问资源,所以发生了死锁。如果两个事务按同样的顺序来访问资源,则不会发生这种类型的死锁。在不改变程序的逻辑情况下,可以通过交换顺序来解决死锁的问题。

关于分析死锁的问题,可以参考前面写的关于阻塞的内容。

一些常用的工具(上)

本次更新下载:http://pan.baidu.com/s/1skXzG4H

源码文档见官方群(以下为7.4更新内容)

逆天工具

 

CDN 资源库

国内

Bootstrap中文网开源项目免费 CDN 服务
360网站卫士常用前端公共库CDN服务
百度静态资源公共库
新浪云计算CDN公共库
又拍云JS库加速服务
七牛云存储 开放静态文件CDN
前端公共库CDN加速-静态资源公共库,免费CDN公共库

国外

cdnjs.com – The free and open source CDN for web related libraries to speed up your website!
Microsoft ASP.net CDN
Google Hosted Libraries
jsDelivr – A free super-fast CDN for developers and webmasters

 

在线开发系列

Create a new fiddle – JSFiddle
RunJS – 在线编辑、展示、分享、交流你的 JavaScript 代码
JSRun javascript在线编辑器,支持scss编译 – JSRun

 

大前端小工具

Bootstrap系

栅格系统定制工具

Shoelace – Visual Bootstrap 3 Grid Builder
Bootstrap Interface Builder | LayoutIt!

CSS相关系列

LESS编译器

在线 LESS 编译器

 

Sass编译器

SassMeister | The Sass Playground!

 

CSS生成器

CSS3 Generator by Pascal von Seth (Pascal-Seven Webdesign from Hamburg)
CSS3 Generator – By Peter Funk & Eric Hoffman
Create CSS3 – Easy CSS3 Generator & SASS Compass CSS3 Generator
CSS3 Playground by Mike Plate

CSS3属性

CSS 属性查询
CSS3 兼容性检测

 

CSS3动画

CSS3 Keyframes Animation Generator
CSS Load

 

大小尺寸系列

CSS单位尺

CSS Ruler • Explore CSS lengths.

手机尺寸大全

Screen Sizes

 

按钮一键生成

CSS Button Generator: Create HTML and CSS Button Styles
CSS Button Generator | Create CSS3 buttons with our CSS button maker

 

其他系列工具

字体转换工具

Create Your Own @font-face Kits | Font Squirrel

 

图片处理系列

UI设计

Ui Parade – Live Tools

 

在线P图

ps在线版 Photoshop在线精简版
AlloyImage

 

字体识别

识字体:图片识别字体 – 工具 – 字客网
字体下载-求字体网提供中文和英文字体库下载、识别与预览服务,找字体的好帮手
What Font is | WhatFontis.com

 

小图合并

GoPng
Free CSS Sprite Generator based on website URL or images – by SCHERP Ontwikkeling

 

路径裁剪

Clip Path — CSS And SVG

 

图标阴影

flattyshadow.com | Long Shadow, Flat Icon, Download Free, Download Free Flat Icon, Flat Icon Free Download , Free Icon Flatty Shadow, Icon Shadow, Icon, Flat, Icon Generator, Flat Icon Generator,Downl

 

图片水印

NConvert

XnView Software · nConvert

 

临时账号系列

临时账号

BugMeNot: share logins

临时邮箱

10 Minute Mail

临时文件

5 Minute Storage

我所知道的黑暗创投圈:为什么我认识的人都成了投资人?

我所知道的黑暗创投圈:为什么我认识的人都成了投资人?

上次爆了我所知道的投资人之后,有人说我写的不是鸡汤,是鸡精汤。好吧,这次我试着直接搅鸡精不防水了。

PS:和标题同名的那家创投服务的同学不用太紧张,不要以为你们取巧取了个这样的名字就能做三个代表了。我就不细说你们创始人在某个投资人的内部会上被台下群喷“你们的模式根本就没意义”这件事了。

孵化器?中国的 YC?别让我笑了

这个其实是我动笔写这篇文章的真正原因,因为我至今无法忘怀中国孵化器给刚入行的我冲击性的印象。在大多数创业者和曾经没有入行的本人眼中,孵化器就是那些诞生下一个百亿科技公司的地方。

但是在中国什么叫孵化器呢?大致上有两种,开一家房地产公司管自己叫孵化器。另一种是开一家培训公司管自己叫孵化器。

那为什么不管自己叫房地产公司或者培训公司呢,对不起人家既干不过传统房地产,也干不过老字号培训。

大多数国内的创业孵化器都是这样的:注册一个创新创业型企业,找当地政府的关系拿块地,万事大吉开始租办公室。

比如说评论尸之前有过合作关系的某个上海的小微创新企业孵化器,他们的主要模式就是上面这一类型,不过他们自己并不这么觉得:

“嗯,我们最大的特色是创新。”

“诶~你们这里还能远程孵化,就是不到你们的地点去办公。那也要交 59800 么?”

“是的。”

“但是,我不用你们的办公室啊。”

“嗯……我们最大的特色是创新。”

不过老实话我觉得这种模式还算好的,起码创业团队能捞到一个便宜的办公地点。另一类就比较奇葩了,以这段时间闹得沸沸扬扬(天天有 PR 打电话过来要发稿的)某百倍加速器来说,他们主打的是培训和课程,宣传中一直说自己是中国版 YC,孵化器官网上一堆知名投资人背书,而其中最大的特色是:不提供创业场地。

为什么国内根本不可能出的了 YC 呢?原因很简单,恰恰是因为国内就缺少这些导师。在 YC,每个你所能见到的老师都是只在 YC 工作的全职导师——他们都是 YC 的合伙人,他们都是因为曾经在产品或者技术上的成功而积累了巨大成功的人,而不像国内的许多投资人那样从一开始就是以投资经理起家走上神坛。

最为可怕的是,即便是那些曾经的以产品以代码起家的创业者们,在经历了中国创业环境伟大而神奇的现实扭曲立场之后也开始变得神神叨叨了。

比如某百倍加速器上提到的那个一步一步写代码做论坛起家最后被企鹅收购跃身中国草根站长偶像的传奇男子,现在也沦落到了靠生辰八字来筛创业者的地步。而另一位在华为、百度都干过技术岗位的知名投资人他的创业经历在百度百科中是这样描述的:“在华为工作了三年,从事的是技术工作,他用三年的积蓄在北京买了套房子……”

忘了说了后面这位投资要看星座,而且不投处女座。

好吧,你说你要真是一个学计算机的,学设计的,搞开发的,你需要一群要产品没搞过产品,谈 Coding 三年都没碰过 IDE,做访谈的时候还一脸自豪的说“我一般投项目要先看看创业者的星座和生辰”的人,来指导你怎么从一个灵感做成一个 Demo?

嗯,那你还是别创业的比较好。

为什么我认识的人都成了投资人?

在中国,创业投资是一门新兴的语言艺术,讲究的是说学逗唱。

“100 天,100 倍”——这种 Slogen 打出来恐怕他们自己都不信吧?现在天使轮大多都融 100 估 1000,十倍是 1 个亿,百倍是 10 个亿。中国真正值十亿的公司用 Excel 列一下都嫌牛刀杀鸡,一个 TXT 就能搞定的事,创业者凭什么有自信跟了这些投资人就能让自己的项目变成十亿公司了?

然而事实也是如此,真正的明眼人都知道在中国把钱投在哪才能获得真正的百倍回报率。而那些看起来并不明智的人,似乎也并不在意自己的钱能够获得足够的回报——换句话说,你的项目究竟怎么样根本没关系。

毕竟中国的许多投资人(尤其是明星投资人)重名大于重利,投资对于他们来说在于挑选合适的捧哏者让自己变得更红,以享受在各种无意义的创业大会上高声宣讲自己根本不可能复制的成功学经验。在这种情况下,创业者只要能在 Demoday 上振振有词,PPT 做的精美绝伦,甚至连产品都没有靠一个灵感就能滔滔不绝讲一个下午,那分分钟都能促成一桩厕所里 5 分钟敲定千万估值的美谈。

但是如果创业者不是捧哏的料,那就对不起了:

如果你的产品概念是全新的——“不好意思,我们不投看不懂的项目。”

如果你的产品特别好——“不好意思,你的竞争对手有先发优势”

如果你的产品占有率高——“不好意思,你有商业模式么?这么大流量不变现是负担啊呀~”

如果你的产品营收不错——“不好意思,你已经过了成长期了,我看不到你们业务的发展。”

如果你啥问题都没有——“如果腾讯山寨你怎么办?”——如果他们想投你这个问题会变成“你觉得腾讯什么时候收购你?”

当然,在移动互联网的泡沫破碎之前,在真正的经济寒冬来临之前,投资人总是有理由说自己的选择是正确的。

前段时间我听说之前一个一直和我有联系的创业者身份变成投资人了,我感到挺新鲜的。因为他们的业务决定了他们挺难退出的。难道这么快就开始盈利分红了吗?他摇了摇头,告诉了我一点不合适在稿子里写的料:

“哪儿啊,上一轮融了千万美金,一年才用了不到不到十分之一。所以,现在搞个基金自己投点东西,要是真赚了钱不是还能给股东多分点么?”

咦,这个和 2008 年引发全球性经济危机的不良资产证券化的思路真是一样一样的呢~

看到这里一定会有人说,作者你不就是想火吗?作者,你不就是吃不到葡萄说葡萄酸吗?

呵呵,实在是不好意思,要是按照国内判定投资人的方式的话。在帝都五环内房产三套,五环外房产两套,身价过千万本尸也必须算是投资人。

哪天要是本尸把存款挪到了在中关村卖水果的男朋友的账号里,再用 5D Mark III 拍两张 PS 的香蕉树都不认识的香蕉,是不是也能在新浪微博认证自己是互联网果蔬电商情趣用品三重跨界投资人了?

别笑,我是认真的。

国内的创业者是什么样的?

在这样的创业环境下,真正在技术上、在产品上、在运营上有大牛的人是不敢出来创业了,蹲在 BAT 里过着 996 的生活好歹在工资上更接近中国(买房)梦。

但是啊,君不见国内创业大会此家唱罢彼登场,又不见科技媒体的项目库一天能上线好几百个新项目。

那这些创业者都是什么呢?我还是举两个例子吧:

之前也说了,尸某因为工作关系也算是半个投资人,也是有些渠道能够拿到创业公司的 BP 的——不过主要原因是国内这些公司的 BP 大多数都是他们一下午做出来的,毫无商业价值,自己也不谨慎四处乱发。

总之,有一天我从一个上过 CCTV 的股权众筹某某汇那收到了两个智能语义分析的项目,一眼看上去以为是一个 PPT 模板搞出来的,再仔细一看……尼玛从文案到产品到数据到分析,两份 BP 除了公司名和 Logo 不一样之外全都一模一样。当即我就把这事报了警告诉了平台,平台第二天就把这个项目下架了。

据说后来,这个创业项目还和平台发生了点小矛盾,创业者说:“你说我们创业者容易么?国内不都是这样一个项目好几套皮吗?”

后来,这个项目被某隔壁投资投了。啧啧,真是钱多到没盆友。

不过,我想说的是这个创业者:“真不是所有创业者都像你们团队那么聪明。”

我还亲眼见到了另一个项目,是一个同性社交类的 App,产品做的好不好先不说,在融资签 Sheet 之前团队就崩了。细八了一下之后,原来是其中的一个创始人私下里把项目上了融资平台,找到了投资,等另外一个创始人发现的时候整个公司都改名换姓了。

唉,也不知道他们用自己家的产品还能不能成为好基友。

当然,这两个还都只是说团队运作上的事情,产品就更惨不忍睹了、

大多数都是都是什么火做什么,什么热做什么,比如最最近的一波风潮是匿名社交。

你说匿名社交这么个产品还能怎么做产品细分,本来就已经是细到不能再细的了好么?但是偏偏就这群粗制滥造的产品就拿了一个又一个投资。

据其中某一款的报道称,他们山寨 Secret 只用了两周的时间,而且已经拿到了投资意向,我下载下来体验了一下。

怎么说呢,确实是两周的水平。

不过现在还打算入匿名社交这个场的小伙伴们注意了,从上周开始投资人就不怎么爱投匿名社交了,因为那个成功地把轻博客和图片音频社交两个产品行业做没了的反向指标刚刚宣布他们也开始做匿名社交了。

从风水玄学的角度,这个产品类目已经死了。

秉持着自黑的精神,说说媒体吧

什么叫科技媒体?

我认为整个编辑部里连一个懂编程的,在翻译 Swift 的时候文章写的像 Chinese Swift 一般令人一头雾水的都不能叫科技媒体。

因此,国内的科技媒体也都给自己取了个响亮的名字叫创业媒体。

其实国内的科技媒体本质是搭台的,为的就是让捧哏和逗哏的上去演戏。这也意味着国内的科技媒体从本质上就离科技很远,而和娱乐媒体差不多。

仔细看看文章列表,不就是那么回事嘛?

每天的内容也就无外乎扒扒大牌明星的八卦(电商又打起来啦,企鹅又要山寨啦)——因为大明星根本不鸟这些三流小报;然后再加点自己的大腿塞过来的小明星——好像把那些不入流的创业者和大佬们放在同一个版面上,前者就熠熠生辉了。

大多数情况下国内的科技媒体都乐于讲述投资人和创业者毫无意义的成功学,却从来不告诉你风风火火卖煎饼的那家之所以能踏进互联网圈是因为人家是投资人创始人夫妻店而且吃过的人都说差。

哦,我就知道有人会说某化学元素媒体是科技媒体领域最后的良心。

其实有的时候我奇怪,为什么一个报项目只捧不杀的媒体能这么受到创业者欢迎?现在创业者的演技就这么浮夸么?后来,有个创业者对我说了一段话:

“其实吧,创业者找你们这些科技媒体报道,也不是为了给用户看的。说实话,你们这些科技媒体能带来几个量啊,塞牙缝都不够,市场要该推还是得走渠道(91、360、豌豆荚)毕竟一分钱一分货。”

“那你让我写这玩意儿干嘛?”

“这不是那啥,当年承诺投资人的 X 倍回报率没达到,也总得让投资人听见点响吧?所以,你能帮我把这句不足删了么……”

原来科技媒体就是帮创业者对得起当年和投资人吹下的牛逼的。

投资人/机构指挥媒体,媒体指挥创业者,创业者再用糟糕的产品反哺投资人和机构的影响力。如果最后盈利了就是用户买单,没盈利就靠着信息沟通障碍漂洋过海让希望国的股民买单。也许你并不是一个创业者,但当你阅读完本文,也该知道你手机里面那些一个又一个体验像翔一样的产品是怎么样生产和流传开来的了吧?

这是一个产业,神圣且光荣。

.NET中Redis安装部署及使用方法简介附->开源Redis操作辅助类

Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博、Github、StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/

Redis 是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

在这篇文章中我们将记录一下Redis的安装,以及如何在.NET中使用Redis。

工具下载位置:http://pan.baidu.com/s/1jILIzLs,包括服务端配置以及查看缓存的工具。

 一、Redis服务端以服务方式运行

服务端是以服务的形式运行,将Redis服务端解压到某个目录,然后以管理员方式运行cmd执行命令进行安装:

redis-server.exe --service-install redis.windows.conf --loglevel verbose

注意卸载服务的命令为:

redis-server.exe --service-uninstall redis.windows.conf --loglevel verbose

注意事项,修改Redis端口及密码的配置在文件redis.windows-service.conf中:(使用redis284.rar中解压文件

 

修改端口,压缩文件中配置的是6488:

修改密码

修改库的数量

配置完成后,执行

redis-server.exe --service-install redis.windows.conf --loglevel verbose

到控制面板查看服务已经安装成功了,注意首次安装时默认没有启动,单击启动即可。

 工具配置,安装后如下图

连接成功后,就可以查看缓存中的数据了

 二、Redis服务端以控制台方式运行

解压下载的redis64-2.6.12.1.rar文件,如下图:

  第一步(配置本地服务)

  点击run这个DOS执行命令
  因为是自己的电脑测试的,所以这个Redis默认的端口我们就不用修改了,如果到了正式的服务器,一定要修改端口号,防止黑客攻击,获取到你的数据,毕竟信息安全很重要,可以通过它的配置文件来修改。
看下用NotePad++打开配置文件,修改过后的效果图,这里我修改成了6380这个端口
这个就是更改过后的效果图了,只要改了端口,再启动run就可以发现端口号确实已经变了,第一步也已经完成了。

第二部(安装和配置客户端)

文件中的“redis-desktop-manager-0.8.2.3849.exe“是2015-11-23 从Redis的官网下载的客户端安装包,如果有更新可以去官网下载最新的Redis,这是链接:http://redis.io/

1.点击客户端安装程序,下一步….,完成打开客户端界面就可以了,省略安装截图。

2.打开界面,客户端默认读取到6379的端口,会创建一个6379的Redis服务器

由于我更改了6379的端口号,导致Redis客户端默认创建的localhost服务器启动不成功,这里只需要右击修改一下端口号就可以了。

三、C#访问Redis

下载ServiceStack.Redis

和MongoDB一样,在.NET中使用Redis其实也是使用第三方驱动,官网推荐的是使用ServiceStack.Redis 下载后解压得到如下dll

.NET项目中使用Redis

ServerStack中有很多方法可以在.NET中调用,其类结构图如下:

 

Redis公共类库参考

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System;
using System.Collections.Generic;
using System.Linq;
namespace RDIFramework.Utilities
{
    using ServiceStack.Redis;
    using ServiceStack.Redis.Generic;
    /// <summary>
    /// Redis公共辅助类库
    /// </summary>
    public class RedisHelper : IDisposable
    {
        public RedisClient Redis = new RedisClient("127.0.0.1", 6379);
        //缓存池
        PooledRedisClientManager prcm = new PooledRedisClientManager();
        //默认缓存过期时间单位秒
        public int secondsTimeOut = 30 * 60;
        /// <summary>
        /// 缓冲池
        /// </summary>
        /// <param name="readWriteHosts"></param>
        /// <param name="readOnlyHosts"></param>
        /// <returns></returns>
        public static PooledRedisClientManager CreateManager(
         string[] readWriteHosts, string[] readOnlyHosts)
        {
            return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
                new RedisClientManagerConfig
                {
                    MaxWritePoolSize = readWriteHosts.Length * 5,
                    MaxReadPoolSize = readOnlyHosts.Length * 5,
                    AutoStart = true,
                });// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };          
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="openPooledRedis">是否开启缓冲池</param>
        public RedisHelper(bool openPooledRedis = false)
        {
            if (openPooledRedis)
            {
                prcm = CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });
                Redis = prcm.GetClient() as RedisClient;
            }
        }
        #region Key/Value存储
        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存建</param>
        /// <param name="t">缓存值</param>
        /// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>
        /// <returns></returns>
        public bool Set<T>(string key, T t, int timeout = 0)
        {
            if (timeout >= 0)
            {
                if (timeout > 0)
                {
                    secondsTimeOut = timeout;
                }
                Redis.Expire(key, secondsTimeOut);
            }
            return Redis.Add<T>(key, t);
        }
        /// <summary>
        /// 获取
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T Get<T>(string key)
        {
            return Redis.Get<T>(key);
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Remove(string key)
        {
            return Redis.Remove(key);
        }
        public bool Add<T>(string key, T t, int timeout)
        {
            if (timeout >= 0)
            {
                if (timeout > 0)
                {
                    secondsTimeOut = timeout;
                }
                Redis.Expire(key, secondsTimeOut);
            }
            return Redis.Add<T>(key, t);
        }
        #endregion
        #region 链表操作
        /// <summary>
        /// 根据IEnumerable数据添加链表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="values"></param>
        /// <param name="timeout"></param>
        public void AddList<T>(string listId, IEnumerable<T> values, int timeout = 0)
        {
            Redis.Expire(listId, 60);
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            if (timeout >= 0)
            {
                if (timeout > 0)
                {
                    secondsTimeOut = timeout;
                }
                Redis.Expire(listId, secondsTimeOut);
            }
            var redisList = iredisClient.Lists[listId];
            redisList.AddRange(values);
            iredisClient.Save();
        }
        /// <summary>
        /// 添加单个实体到链表中
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="Item"></param>
        /// <param name="timeout"></param>
        public void AddEntityToList<T>(string listId, T Item, int timeout = 0)
        {
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            if (timeout >= 0)
            {
                if (timeout > 0)
                {
                    secondsTimeOut = timeout;
                }
                Redis.Expire(listId, secondsTimeOut);
            }
            var redisList = iredisClient.Lists[listId];
            redisList.Add(Item);
            iredisClient.Save();
        }
        /// <summary>
        /// 获取链表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <returns></returns>
        public IEnumerable<T> GetList<T>(string listId)
        {
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            return iredisClient.Lists[listId];
        }
        /// <summary>
        /// 在链表中删除单个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="t"></param>
        public void RemoveEntityFromList<T>(string listId, T t)
        {
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            var redisList = iredisClient.Lists[listId];
            redisList.RemoveValue(t);
            iredisClient.Save();
        }
        /// <summary>
        /// 根据lambada表达式删除符合条件的实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="func"></param>
        public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
        {
            using (IRedisTypedClient<T> iredisClient = Redis.As<T>())
            {
                var redisList = iredisClient.Lists[listId];
                T value = redisList.Where(func).FirstOrDefault();
                redisList.RemoveValue(value);
                iredisClient.Save();
            }
        }
        #endregion
        //释放资源
        public void Dispose()
        {
            if (Redis != null)
            {
                Redis.Dispose();
                Redis = null;
            }
            GC.Collect();
        }
    }
}

 

那些年,被自己的技术者思维虐过的项目经理们

不论在哪个国家,IT 公司中的项目经理,很大一部分都是技术出身。的确,工程师背景的项目经理,在开发人员选择,开发进度控制,客户需求把握等诸多方面,有得天独厚的优势,从程序员到 leader 再到项目经理也是常见职场发展方向之一。

雷子个人认为,从普遍意义上讲,在日本,只要勤奋努力,向上走是很容易的事。但到了管理岗位,即使勤奋努力,有时候思维没有及时转变,也可能遭遇惨败。我就亲见过智商一流,经验丰富技术人员,初任项目经理时,分外努力却搞得焦头烂额,甚至在项目中途被换下,经过很久很久才熬到第二次被提拔……

职场上升之路,有时需要些时运,可能各有不同,但失败的原因,有时却很相似。那么,技术者在初任项目经理时,经常会遇到哪些问题,给自己挖哪些坑呢?

  故事一

  有时候,谎话连篇的项目经理才是好经理

A 君,认识他时,他是个年轻的 leader,技术很不错,还有开荒牛般的勤勉,性格也非常开朗坦诚,能力人品双佳,当 leader 时成绩斐然,自然的,他很快升到了项目经理,一时间意气风发。

A 做 leader 时很受爱戴,成为了项目经理,依旧沿用了一贯的坦率作风,事无巨细,和大家分享所有和项目有关的事。甚至包括:客户方面的负责人突然换人啊,咱们的契约很危险啊这些情报,也全都毫无保留地告诉给组员们。那么,像A预期地一样,全组拧成一股绳,项目圆满顺利地进行下去了吗?

实际上,并没有。在充分了解项目的同时,组员们也知道了大量的关于这个项目的不利因素,倍感不安。私底下,咱领导心里也没底啊,项目要扑街啊,这样的议论越来越多,A明明比做技术时更加努力,但项目状况却每况越下,回天乏力。

最后,连部长都觉得“怎么搞成这样,哎,A还是太年轻。”无奈在项目中期换下了A,让经验丰富的B顶上。

B 是个待人和善,初次见面就会让人印象很好的人。上任后,B和整个项目组的人挨个私聊,发现了问题所在——很多人对本来不用他们操心的事感到不安。这种不安,有时甚至影响到了他们的本职工作。

于是,B把大家召集到一起开会,“通过沟通,我了解了大家现在的想法,和对这个项目前景的担心。不过这些担心,很多都是针对潜在的风险的,还有一些问题,是我可以通过斡旋调节解决掉的,balabala……”总之,就是天空飘过几个字儿,那都不是事儿。

这个会,开得效果很好,B自信满满,言之凿凿的一番话,很好的安抚了组员们的情绪,大家专心开发,项目进度竟慢慢地赶上了。

那么B真的像他表现出来的一样有自信吗?

事情的真相是,他非常了解——这个破项目,问题一大把。和组员说的话,很多都是他信口胡诌的……

作为项目组的普通成员或者 leader,不管说什么都要有根有据,信口胡诌是绝对不行的。但这不适用于项目经理。有时候就算是睁着眼说瞎话,也得把组员往正确的方向上带。

“不管怎么努力也来不及了”,一旦让组员有了这种想法,那项目就必定要完。互相扯皮,产生信任危机,生产性下降,品质恶化,是一连串的连锁反应。无论如何也要避免这种情况的发生。

 教训一

项目经理必须要让组员相信:“这些情况早就在我的预料和控制之内,大家放心。”只有这样,组员才能心无旁骛的做好自己的事情。给组员们吃定心丸——是项目管理的手段之一。

这时有的同学可能会说,很多项目从一开始就明摆着是坑,瞎子都能看出来。但即使是这样,把真实情况全部如实传达给组员,也是一点好处都没有。就算项目真的无论如何也挽救不了,那也是项目经理一个人的责任。把真实情况隐瞒下来,让组员们安心工作,多少还有一点希望。就算扑街,也不会姿势太惨烈。反过来,把真实情况和盘托出,导致军心涣散,那就真的一点儿机会也没有了。

 故事二

  有时候,不会较真的项目经理才是好经理

C 君做工程师的时候,非常优秀。思维敏捷,逻辑清晰,精通各种开发语言。最重要的是,发生问题时,他一定要刨根问底的追查,不仅要找到解决方法还要找到问题的根本原因,从流程上改进,防止再发。这样的思考方式和做法,很多工程师都有。

当时的上司和同事们对C君都是绝对地信赖,即使有时他在刨根问底上花费了太多时间,导致进度延迟,上司也都是积极地同客户调整进度或者加人,从不给他脸色看。

当得知C申请做项目管理,而不是走技术路线的时候,大家都挺吃惊的。不过他作为项目经理,负责的前两个小型案件都完成得满好。这时他的上司有些放心了,觉得聪明又努力的人,做什么都会做得不错吧。

之后,他被指定去负责一个具有一定规模的项目。这个项目所开发的系统,有十几个子模块,每个模块有3~4 个成员负责。

一天,C收到了客户发来的邮件“项目进度全体看起来很顺利,但是几个子模块开发进度为什么有些延迟?什么地方出了问题吗?”

C 作为整个案件的项目经理,通常是掌握项目的大体情况,对于每个子模块开发的具体细节并没有过问。第一次被客户质问开发进度延迟的理由,C有点坐不住了,而且他也产生了同样的疑问。

于是,C君询问了这个模块的每个开发人员,得到的回答是:该模块所使用的部分第三方产品,有兼容性问题,加上调用方法不对,不断试错导致了这部分的开发延迟。可是C还是有疑问:“产品兼容性和调用方法不对,真的会导致生产性这么大的降低吗?”

于是C又开始了他对于问题刨根问底式的追查。把每个项目组成员负责的工作细细地捋了一遍,得出的结论是——恩,和他们说的一样。于是,他向客户如实地汇报了原因,客户也接受了他的解释。

但是他这么一折腾,本就有点儿延迟的项目,又浪费掉了更多的工数,给组员和他自己又加重了负担。

本来对客户作出最初的解释就完全够了,可是C并没有那么做。像做工程师时一样,在这个问题上刨根问底,但整个过程却只是他的自我满足。本来项目经理和成员之间是互相信任的,由于这件事,信赖关系也出现了裂痕。

在分析问题原因这件事上,项目经理追求的目标应该是客户的满足感。如果弄错了这个目标,花费了大量的精力,那就得不偿失了。

比如说客户问,为什么这个系统能够运行?这个时候只要从产品框架的程度上给客户作出解释就完全够了。如果真要从编程语言和计算机原理的开始讲给客户听,只会让客户一头雾水吧。

确实,如果花费大量的时间精力,去把一个问题彻底弄清,非黑即白,对今后的工作是有帮助的。但这是工程师该做的事情,而不是项目经理。

 教训二

项目经理应该把更多的精力放在客户和成员的组织协调方面。有时候,不得不对问题的正确性和精准性做出妥协。从工程师出身的经理,往往在这一点上很难转变。

 故事三

  有时候,不会和部下同甘共苦的项目经理才是好经理

  第三个故事,是我的故事。

大多数工程师都是很单纯很热心的人。如果组里的其他成员遇到了什么问题卡住了,很多工程师会留下来加班帮他一起把问题解决掉。但这种做法并不适用于项目经理。

我以前当工程师的时候,一次遇到客户要求调查一个问题,要的很急。我和项目经理两个人一直调查到很晚,都没有做完。眼看要赶不上终电了,项目经理一脸抱歉地对我说:“不好意思啊雷子君,今天就辛苦一下,加个通宵的班吧。”

客户要求的,也没有办法,所以我就很爽快地答应了。本来以为项目经理也会留下来和我一起加班,没想到这个大哥说了一句“后面的就拜托了!”然后拎包就回家了,只剩下我坐在那里独自凌乱。

虽然明知项目经理留下陪我加班没有意义,但当时不免心里是颇有微词的。直到后来我自己也当上了项目经理,才体会到他的做法完全正确。

我作为一个个体的工程师,只要对项目经理一个人负责就可以了。但是项目经理需要对整个项目负责,对客户负责。如果他留下来陪我一起加班,第二天早晨一起回家的话,那么第二天的项目推进谁来管?如果客户对于调查结果有追加的疑问,让谁来对应?就算他第二天不回家,一直留下来完成自身的工作,那恐怕也是精疲力尽,效率会大打折扣吧。

上面这张图是网上流传很久的,leader 和项目经理的区别。作为 leader,和成员们同甘共苦,是很有必要的,但项目经理绝对不可以。反过来,leader 和成员们只要低头努力工作就够了,但项目经理坐的位置,决定了只有他才能看到前方有没有深渊,后面有没有猛兽。这一点谁都代替不了。

教训三

技术者升级为项目经理,切不可再像做工程师的时候那样事事亲力亲为。懂得自己该做什么,懂得找擅长的人去做他擅长的事情,才是经营之道。

故事四

  有时候,想着「等前提条件都确定了再开工」的项目经理不是好经理

  这个故事是个段子。

某日,老师在课堂问一个学生: “树上有十只鸟,开枪打死一只,还剩几只?”

学生反问“是无声手枪或别的无声的枪吗?”

“不是。”

“枪声有多大?”

“80-100 分贝。”

“那就是说会震的耳朵疼?”

“是。”

“在这个城市里打鸟犯不犯法?”

“不犯。”

“您确定那只鸟真的被打死啦?”

“确定。”老师已经不耐烦了“拜托,你告诉我还剩几只就行了,OK?”

“OK,树上的鸟里有没有聋子?”

“没有。”

“有没有关在笼子里的?”

“没有。”

“边上还有没有其他的树,树上还有没有其他鸟?”

“没有。”

“有没有残疾的或饿的飞不动的鸟?”

“没有。”

“算不算怀孕肚子里的小鸟?”

“不算。”

“打鸟的人眼有没有花?保证是十只?”

“没有花,就十只。” 老师已经满脑门是汗,且下课铃响,但学生继续问,

“有没有傻的不怕死的?”

“都怕死。”

“会不会一枪打死两只?”

“不会。”

“所有的鸟都可以自由活动吗?”

“完全可以。”

“如果没有其他前提条件,”学生满怀信心的说,“打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩。”

老师擦了擦汗说:“你一定是个程序员……”

编程做久了,往往思维方式会发生固化。工程师都对事物的逻辑性和因果关系有着执拗的追求,“把前提条件全都告诉我”,是工程师的常用语。当然,从工程师的角度来看,前提条件不明确就开工,最后能做出什么样的东西来,只有上帝才知道。

但是,这个世界上从来就没有过从最开始就明确了所有前提和需求的项目。这个时候,就需要对案件的情况做出各种假设,分析可能性,然后在保证最大正确性的前提下开工。如果在项目途中,前提条件或者需求发生了改变,那就再根据具体情况进行调整——这考验的是项目经理的能力。不这么做的话,项目永远也开始不了。

在设计第一台月球车的时候,如果 NASA 宇航局的工程师说:“请把月球表面的详细情报告诉我,否则我没法设计”,这样的话人类可能永远只能在地球上晃悠。当时,月球表面的状态只能从望远镜里观测到的景象进行推测。虽然前提条件很不充分,但也只有基于最大可能性开始设计,别无他法。

做项目也是一样。设计系统的时候,要假设各种各样的前提:系统使用年限,最大并发访问数,相关的法律会不会更改(特别是政府项目或者和金融相关的系统)……

 教训四

  先从最确定,可能性最大的部分开始做起,当需求和前提渐渐明确,再逐步调整进度和人员安排。对于项目全局的把握和大局观,往往是工程师初任项目经理时,最为欠缺的部分。

今天,和大家分享了几个小故事,愿大家在职场上升道路上避免这些有可能走的弯路,少付出一些成长的代价。

看法浅薄,期待与大家更多的交流讨论。更加欢迎老司机们向大家分享自己看到过,经历过的职场经验。

国内各大互联网公司相关技术站点3.0版 (集合腾讯、阿里、百度、搜狐、新浪、网易、360等共29个)

近日重新整理了一番,希望能对大家有所帮助

2013年

腾讯系列(13)  阿里系列(18)  百度系列(3)  搜狐系列(3)  新浪系列(2)  360系列(2)   其他(9)

2016年

腾讯系列(9)  阿里系列(5)  百度系列(6)  搜狐系列(1)  新浪系列(1)  360系列(2)   其他(3) 新增 网易(2)


腾讯系列(9)

1.财付通设计中心 TID 

成立于2005年 最近一次更新: 2015-01-14

2.QQ邮箱博客   

内容主要是邮箱每次更新首页的文案。

最近一次更新: 2016年03月07日

3.腾讯用户研究与体验设计部 CDC

2003年开始组建,正式成立于2006年5月,是腾讯公司级的设计团队,分布深圳、北京、成都三地,致力于提升腾讯产品的用户体验,探索互联网生态体验创新。

最近一次更新: 2016.05.10

4.腾讯游戏官方设计团队TGideas

TGideas隶属于腾讯互动娱乐业务系统,是一支专注于运营和营销领域的用户体验设计团队,工作范围涉及产品包装、广告创意、品牌建设、互动设计等,团队由专业的企划、项目管理、创意、视觉、开发、多媒体人才构成。

最近一次更新:2016-04-06

5.腾讯移动互联网设计团队MXD 

最近一次更新:2016.05.31

6.腾讯社交用户体验设计部ISUX

成立于2011年1月11日,是腾讯集团核心、全球最具规模的UX设计团队,专业成员包括用户研究、交互设计、视觉设计、品牌设计、视频动画设计、UI开发、产品设计与市场研究等,至今ISUX分布于中国深圳总部、北京、上海、成都及韩国首尔。

最近一次更新:2weeks ago

7.腾讯大讲堂

腾讯知识分享平台 最近一次更新: 2016.5.30

8. 腾讯Web前端 Alloy 团队 Blog 

来自于腾讯SNG(社交网络事业群),致力于Web前端技术的研究,热衷HTML5、移动Web技术,用最酷的新技术开发各种有趣的开源项目

最近一次更新:2016年05月30日

9.腾讯前端IMWEB团队

正式成立的时间是2011年6月7日,团队创立之初是负责腾讯最核心的基础业务,QQ注册, QQ登录(ptlogin),QQ资料和关系链拓展等基础服务。 后转型进行应用开发,分别投入Q+,QQ圈子, QQ匿名聊,QQ群整体业务等。目前主要负责腾讯在线教育战略产品腾讯课堂,多人社交互动视频以及活动 组织类项目的研发工作。 IMWeb团队成员目前已分布全国各大互联网企业,或有些在创业公司担当要职。

最近一次更新:2016-06-06


已挂 (5)
MacQQ的项目团队 IBlog    QQ客户端团队博客 腾讯电商用户设计体验部ECD QQ游戏设计中心GDC 腾讯微信博客


阿里系列(5)

1.阿里巴巴中国站用户体验设计部UED

1688UED 成立于1999年,历史悠久,底蕴深厚,是阿里巴巴集团最为资深的用户体验设计部门之一。

最近一次更新: 六月 6th, 2016

2.阿里巴巴国际站UED团队

最近一次更新:2016/05/30

3.阿里妈妈MUX(原淘宝一淘用户体验中心UX)

是阿里妈妈下的用户体验部门。负责大淘宝的广告业务,以及阿里妈妈的用户体验工作

最近一次更新:2016/04/11

4.阿里(原淘宝JAVA)中间件团队博客

是国内为数不多的极具技术挑战性的团队之一。致力于成为中国第一,世界一流的Java技术团队。

自主研发的一系列产品始于07年底开始的淘宝架构2.0到3.0的变迁过程中,使淘宝网 从集中式的Java应用走向了分布式Java应用,涵盖了消息中间件、服务框架、数据层、应用服务器和大规模分布式稳定性平台等等。

最近一次更新: 2016-06-02

5.淘宝前端团队FED

最近一次更新: 2016-06-02


已挂(13)

淘宝网UED官方博客  支付宝用户体验部UED 淘宝良无限(无名良品)用户体验团队博客UED 阿里集团数据平台官方博客 阿里巴巴集团数据库技术团队

淘宝网综合业务平台团队博客 淘宝搜索技术博客 支付宝中间件团队 天猫UED 淘宝核心系统团队RDC 阿里 RDS Blog 淘测试 量子恒道官方博客


百度系列(6)

1.百度Web 前端研发部FEX(原百度泛用户体验部UUX)

致力于提升百度各个产品线的研发效率及页面体验,是百度内部最具影响力的前端团队,最早的开源实践者,并先后推出了 Tangram、UEditor、FIS、GMU、webuploader、kityminder 等库和工具

最近一次更新:06 Jun 2016

2.百度移动(原无线)用户体验部MUX

最近一次更新: 2016年4月11日

3.百度搜索用户体验中心SUX(原百度商业用户体验部UED)

由原百度“搜索业务用户体验部”、“商业产品用户体验部”合并而成。

围绕百度最核心的搜索业务,为提高数以亿计用户的交互体验和商业伙伴服务品质而努力。并致力于创建搜索引擎的极致用户体验,及用户行为与商业环境的和谐之美。

博客内容涉用户体验、用户研究、商业模式、搜索引擎、交互设计、广告营销等方面,分享业内最生动的资讯与见解。

最近一次更新:2015年06月18日

4.百度EFE(Excellent FrontEnd)

前身是ECOM前端团队,后经过技术的发展,逐渐形成一套完善的前端技术体系。

最近一次更新: 2016-05-13 

5.百度企业产品用户体验中心EUX

最近一次更新:2016-5-9

6.Baidu LAMP Tech

专注于LAMP技术,不限于PHP,Linux,MySQL,Nginx。

最近一次更新:2015-02-13


搜狐系列(1)

1.搜狐畅游视觉设计中心团队VC


已挂(2)

搜狐移动门户中心用户体验团队MUED   搜狐焦点用户体验设计UED


新浪系列(1)

1.新浪UED

最近一次更新:2013-12-31


已挂(1)

新浪微博用户体验设计中心UDC


360系列(2)

1.360奇舞团前端团队75Team

是奇虎360公司Web平台部前端工程师 + 部分特约嘉宾 组成的一个前端团队。

最近一次更新:06月04, 2016

2.360UXC用户体验设计中心

最近一次更新:2015.7.7


网易系列(2)

1.网易用户体验设计中心UEDC

成立于2008年底。目前设计中心服务的产品包括网易门户、邮箱、博客、无线、交友、基础产品等

最近一次更新:2016.04.29

2.网易NetEase前端技术部FED

属于网易杭州研究院,负责web前端、移动端、数据可视化方向的技术研发、技术支持以及培训教育。研发的框架、组件、工具、平台广泛应用于网易考拉、网易云音乐、网易云课堂等网易核心产品。

最近一次更新:四月 25th, 2016


其他(3)

1.携程旅行前端开发团队UED

最近一次更新:2016-05-25

2.迅雷用户体验设计中心CUED

最近一次更新:2015-03-03

3.京东设计中心 JDC

最近一次更新:2015.07.09


已挂(3)

人人网FED 搜狗设计团队UED博客 爱词霸UED团队 


个人感想:

时隔3年再次整理,已有二十个站点挂掉,现整理出的29个站点,今年有21个还在活跃更新。

信息爆炸碎片化的时代,坚持技术的分享与交流并不是件容易的事,在此致敬以下各大团队:

腾讯用户研究与体验设计部 CDC   腾讯游戏官方设计团队TGideas 腾讯移动互联网设计团队MXD  腾讯社交用户体验设计部ISUX  腾讯前端IMWEB团队 腾讯Web前端  腾讯Web前端 Alloy 团队 Blog

阿里中国站用户体验设计部UED  阿里国际站UED团队 阿里妈妈MUX(原淘宝一淘用户体验中心UX) 阿里(原淘宝JAVA)中间件团队博客 淘宝前端团队FED百度Web 前端研发部FEX(原百度泛用户体验部UUX)

百度移动(原无线)用户体验部MUX 百度EFE(Excellent FrontEnd)  百度企业产品用户体验中心EUX360奇舞团前端团队75Team 网易用户体验设计中心UEDC 网易NetEase前端技术部FED 携程旅行前端开发团队UED

 

如有纰漏,还请指正,感谢。

互联网江湖挖人大战,是迷狂还是理性?

文/李云蝶

为了“21 世纪最贵的东西”,这些年来,中国互联网公司间的战争越来越惨烈。

创业公司挖角行业前辈和 BAT,BAT 之间互挖或向下网罗垂直领域的优秀人才,有钱的公司强取豪夺,没钱的公司借钱也要将挖角进行到底。

人才,尤其是高管,是互联网公司、科技公司厮杀江湖的重型装备。挖什么人?从哪挖人?许以什么诱惑?如何面对被挖?这一场漫无终点的大战,是否精确理性的算计,还是情难自禁的迷狂,抑或人在江湖身不由己?

一、浑水互联网江湖

1、门口的“野蛮人”

前些天,乐视游过护城河,挖人挖到了华为城墙脚下,引发一系列传闻。

江湖传言前华为荣耀总裁刘江峰和原华为电商总裁徐昕泉重出手机江湖,携几位华为终端的前中层一并加入乐视,江湖人称“复仇者联盟”。有好事者称华为恼羞成怒,竟效仿 10 多年前为打击“叛逃员工”成立的“打港办”(针对李一男出走成立“港湾网络”与华为形成竞争),在最高经营层(EMT)成立“打乐办”。

此番言论毫不意外地遭到了华为官方否认,真假并不重要,在互联网企业持续已久的人才暗战中,“挖角”已是公开的秘密。乐视高调的人才招募计划和源源不断涌入的原传统企业高管,让它拿下了“挖角王”的称号,光是手机部门,就已经“汇聚”了魅族、联想、小米、摩托罗拉等多家手机公司高管,以联想系最多。其中,乐视移动总裁冯幸,此前在联想 20 年的职业生涯中,从 1994 年一名联想工程师成长为统领联想中国手机业务的集团副总裁,在他的带领下,联想仅用了三年时间,于 2013 年成为中国市场第二、全球市场第三的智能手机厂商。

而乐视最近的一位加盟者应该是前上汽集团副总裁张海亮,他从 1994 年开始工作起便就职于上海大众,2014 年刚刚成为上汽最年轻的副总裁,曾被看作是最有潜力成为上汽集团下一代“接班人”的高管。

自此,原英菲尼迪中国及亚太区总经理吕征宇,原上汽集团原副总裁、上海通用总经理、张江高科前董事长、上海浦东新区前副区长丁磊,原广汽丰田副总经理、广汽吉奥总经理高景深等一众传统车企明星高管已聚集在乐视旗下。

这家以视频起家的公司如今又是造车又要上月球,聚集了来自传统行业的上百位高管。乐视控股人力资源副总裁蒋晓琳接受《财经国家周刊》记者独家专访时说,在乐视内部,贾跃亭每周一都会亲自主持总裁会,把其七大子生态、来自汽车、金融、媒体、互联网等完全不同行业的高管聚集在一起,用同一种语言聊一个战略,这在其他公司很难想象。

互联网公司在探索初期若想快速发展,挖人是最省时省力的方法。

在各家挖角目标名单中,互联网的三座大山——BAT 必然排在榜首。

百度作为一家技术导向型的公司,无论是搜索引擎还是百度地图亦或是糯米团购,其背后有强大的服务器和高深的算法支持,而李彦宏作为海归派,更是吸纳了不少不国际顶级技术人才。因此,当技术导向型公司开辟垂直业务时,通常会选择挖角百度。例如,2014 年,美团挖角百度前 LBS 负责人沈丽做高级副总裁,而 360 和百度的互挖更是持续不断,甚至有人自称是 360 派往百度的卧底,去反水百度人改投 360 麾下,策反收入高达 30 多万。

而阿里作为一家以淘宝、天猫等为主营业务的电商平台,其新业务开展都跟现有用户结合相当紧密,坐拥这么大的用户资源,新产品的推出基本上就是一个导流量的过程,运营在其中作用巨大,这导致了阿里运营文化的极度强势。

再看腾讯,从腾讯旗下的 QQ,到后来的微信等产品,都是深度挖掘用户需求的产物,并且还在不断地迭代。加之创始人马化腾为人比较低调,被员工称为超级产品经理,对旗下很多产品项目都亲自过问,这也形成整个公司关注产品需求的氛围,以及相关的人才需求。

巨头的强项如此明显,也为互联网创业公司挖角提供了导向——百度的技术经理、阿里的运营经理、腾讯的产品经理,一向是创业公司挖角的首选。

这些公司大都嗓门大于内功,还没找到核心盈利模式,靠着不断的融资探索生存。相比于赚钱,更善于花钱。正所谓“缺什么补什么”——一切能用钱解决的问题都不是问题。

互联网公司也较传统公司更重视H。一方面,为公司迅速扩大的业务快速补充人才,另一方面,也是为了加强对员工的管理和培训。其中,京东 HR 部门的员工已经近 400 人。

不仅小公司,大公司在人才流失和战略转型中,也将挖掘机瞄准了对手的田地。

一方面,BAT 这些巨头无一不在挖墙脚方面下足了功夫。有人说,当他们厮杀在一块,通常的节奏是这样的:阿里挖百度的人;腾讯挖阿里的人;百度挖中小公司人;其他科技创业企业也要横插一杠——总之,冤冤相报无了时。

另一方面,在巨头薄弱的环节,他们也盯上了在某方面比自己强的小兄弟。例如,正在把视线投向线下的电商之王阿里,在完成了对苏宁的投资之后,也从苏宁挖来了大量渠道型人才。甚至,有阿里人调侃,“被我们打败的人成了我们的领导”。

有人感慨,如果华尔街是一个对人才明争暗斗的名利场,那么硅谷和中关村显然在挖人这件事情上更坦坦荡荡,更追求速度,更像古罗马的竞技场。

2、西方:互不挖人?别搞笑了

几年前,硅谷大公司高管之间达成了一项“秘密协议”——互不挖人,这项协议第一次暴露是在五年前,更有趣的是,它的初衷并不是所谓“商业道德”,而是“节约成本”。

2011 年,苹果、谷歌等公司被五名软件工程师起诉了,原因是包括苹果、谷歌、英特尔在内的数家行业巨头,自 21 世纪初期开始,秘密达成“不挖墙角”协议,从而人为地抑制职员薪酬的提高。而这场协议的由头是,2005 年,谷歌联合创始人谢尔盖·布林曾试图雇用一支来自苹果的浏览器团队,受到乔布斯警告,同意互不猎聘对方员工。后来,越来越多的公司加入这项“握手之约”,它们中至少还有 Adobe、Intuit、英特尔和皮克斯。

巨头之间达成了表面和谐,你以为他们就真的不挖了吗?那你太天真了!

以“始作俑者”苹果为例,除了对协定中的几个小伙伴儿保持友好,不管是竞争对手、合作伙伴还是无关的公司,通通挖来再说。

它曾挖来耐克的设计主管、耐克 Fuel Band 智能腕带的主要设计师之一本·沙菲尔(Ben Shaffer)设计智能穿戴,挖来《纽约时报》设计主管阿雷姆·杜普莱西斯(Arem Duplessis)出任营销团队的创意主管。2012 年 10 月,三星刚从 AMD 招揽来的芯片设计专家吉姆·米基德转眼就被挖到了苹果;2014 年 3 月,有消息传苹果为生产大屏幕 iPhone6,从竞争对手 HTC 和其台湾的供应商英业达公司、广达电脑狂挖工程师来建设自己的上海和台北团队。甚至,苹果还曾挖来在博通工作 10 年之久的工程师 Xiping Wang 和博通公司前任首席工程师 Paul Chang,要知道,博通公司可是 iPhone 基带的供应商,而苹果却连续三年从博通和高通公司招聘了至少 30 位中级和高级基带软件和硬件工程师。

去年 10 月,一家来自美国旧金山的初创公司 Mission Motorcycles 由于被苹果挖走了 6 名主要工程师,导致融资受到严重影响,最终申请破产。

当然,被苹果挖人的公司也不都是善茬,去年 2 月,特斯拉 CEO 马斯克就公开透露,苹果在诱惑自己的员工,提出的待遇包括 25 万美元的签约奖金和 60% 的薪金提升,不过“至今没招到几个人”。特斯拉也没闲着,当时已经雇佣了大约 150 名前苹果员工,以至于特斯拉无论是零售店还是中控系统,都透着一股浓浓的“苹果味”。

Google 们也越来越多地受到一大群独角兽公司的冲击。Uber,这家估值超过 500 亿美元的超大型独角兽,为了增强自己的地图研发能力,竟然成体系地挖走了 Google 的地图绘制部门。颇受欢迎的短租初创公司 Airbnb 也已经招人招红了眼,从别的地方挖来了一百多号人。

亚马逊 CEO 杰夫·贝佐斯曾在一份回应《纽约时报》报道公司工作环境的新闻的备忘录中,抱怨他的员工“每天都被其他世界级的公司挖走”。他没有具体说是哪些公司在追着亚马逊的员工跑。

这群估值在 10 亿美元及以上的热门初创公司,都在竭力追逐着硅谷最好、最聪明的人才,许以人道的工作环境和令人吃惊的薪酬。

二、挖人逻辑:鼠标与水泥的融合

互联网公司的人才战略是和互联网的发展相同步的,从前,互联网只是一个工具,填补人类在不同方面的需要,而互联网公司要做的就是通过尖端技术,不管提高声量,赔本卖吆喝。现在,互联网已经渗透到生活的方方面面,甚至已经开始创造需求,而商业模式也成了急迫的需要。

换句话说,曾经的互联网理性而单一,如今感性而复杂。变化到人才战略上,也是同理。

1、从前:技术统治世界

在一项业务刚刚启动的阶段,对人才的需求往往都是技术导向型的。

同样的,在互联网企业发展初期,缺乏合适的技术人才,成为整个行业的普遍状况。“我认识的 95% 的线下出身的创业者都找不到技术合伙人。”两年前,滴滴 CEO 程维如是说,滴滴也曾在创业初期因为不合适的技术合伙人付出了数百万人民币的代价,直到 2012 年底挖来了百度的研发经理张博,才补齐了技术的短板。

为了挖人,这些公司可谓使尽浑身解数。母婴电商蜜芽上线初期,蜜芽宝贝 CEO 刘楠甚至直接坐在好乐买的办公楼下,连续几天挨个给他们的技术总监打电话,将技术团队扩充到八十余人。

乐视在刚开始做电视时,直接挖来高通的技术高管,设置了圣地亚哥的研发中心。

腾讯去年投资成立汽车公司 Future Mobility Corporation Ltd.,直接从谷歌和戴姆勒挖角多名核心高管,使其拥有研发自动驾驶技术方面的强大团队用于角逐新一轮的竞争。

这场技术人才争夺战的高潮,是去年三月份,雅虎北京全球研发中心关闭引发的挖人大战。彼时,雅虎前全球副总裁和雅虎北京全球研发中心总经理张晨与旗下 300 多位研发人员成为无主之人,其中,八成以上拥有研究生及以上学历,四成来自中国排名前十的高等学府,二成拥有海外背景,张晨更是有着在美国雅虎总部 10 年的工作经验。而他们的研究方向——个性化广告、移动和云计算,恰恰是现在中国互联网电商最急需的技术方向。前来争抢的不乏微软、腾讯、京东、新浪、小米等互联网巨头。

刘强东竟然亲自出马,沏好一壶茶,用一口带着宿迁口音的普通话,将 12 年来如何打下京东这片江山娓娓道来,一举将张晨及其雅虎的核心团队招至麾下。

“整个中国互联网行业的高速发展需求催生了极度的人才饥渴。”豌豆荚商业产品副总裁张宁如此评论雅虎北研关闭引发的挖人大战。美团网 CEO 王兴也曾表示,能够赢得当年的千团大战,技术部的能力功不可没。

那个年代就像硅谷投资大师保罗·格林汉姆所说的,“没办法,这些书呆子看上去正在接管世界。”

除了满足自身的需求,顺带打击对手也是挖人的一个核心目的,或者,有时候并不是刻意为之,只是因为人才对于技术导向型的初期发展太过重要,挖走核心人才就等于挖走了一家公司的心脏。

来看看那些被乐视挖角的公司就知道了,被乐视电商领域挖角的当当网在若干轮的电商大战中已经败北,彻底退出电商第一梯队;被乐视移动挖角的联想手机业务也早已掉出前五,而曾被认为是杨元庆接班人的联想移动业务集团负责人刘军甚至被解职;马麟离职之后的魅族成了一家发布会导向的公司,接受了阿里的注资,接连推出了魅蓝和魅蓝 Note 系列廉价机,与他曾经不屑一顾的小米争夺入门机市场。

甚至有人说,倘若你的高管都加入乐视了,那可能真是贵司衰落的开始。

补足短板和打击对手一箭双雕,这也是为什么人才在互联网时代显得尤为重要。

然而,随着技术的日渐成熟,鼠标与水泥割裂的时代已然过去,人才争夺战还在继续,但是互联网公司的人才挖掘机已经慢慢改换了方向。

2、未来:商业化的融合人才

如今,互联网公司招人的热潮不仅局限在对最好的工程师的争夺上,有时候也会扩大到非技术类员工身上。在过去的两年时间里,为 Google 员工做饭的两位厨师阿尔文·桑(Alvin San)和拉斐尔·蒙弗特(Rafael Monfort)已经分别被 Uber 和 Airbnb 给挖走了,谷歌的食堂被公认为拥有全世界最美味的食物,挖来谷歌的厨师对吸引人才无疑是个巨大的诱惑。

从库克的挖人动向上,能感受到苹果也正加速走向一个融合、链接时代。2013 年,苹果立意变革营销,人们以为他会从谷歌或者互联网公司拉人,但他却挖来巴宝瑞美女 CEO,后者强调要重塑苹果渠道,让它能接触到过去无法接触到的人。这与库克声明里关注细微的需求、少数人吻合。

除此之外,苹果的人才也包括一大批艺术家。之前苹果花费巨资收购 Beats 电子公司,吸引了说唱明星 Dr. Dre 和音乐行业大腕 Jimmy Iovine 的加盟,辅佐音乐业务。随后, 苹果又从英国广播公司挖来了一名大牌 DJ(电台音乐节目主持人)罗伊(Zane Lowe),疑参与即将发布的全新音乐流媒体服务。

反观中国,娱乐明星纷纷加入互联网公司担当职务,周杰伦加入唯品会,出任首席惊喜官(CJO)一职;美丽说宣布 Angelababy 成为旗下海淘品牌 HIGO 的首席时尚官(CFO)。因“我是歌手”一炮而红的韩国歌手黄致列也在今年 3 月初入职步步高旗下的电商平台云猴全球购,担任全球首席买手。

除此之外,也有一些名人加入。去年年底,何炅加入阿里音乐团队,任 CCO 一职,而在那之前,高晓松、宋柯已正式加盟阿里音乐,分别担任董事长、CEO 两大要职。今年五月,360 官方在微博上宣布,正式任命著名主持人李湘为 360 娱乐总裁,负责整体娱乐资源的整合,360 娱乐内容的打造,以娱乐产品支撑 360 公司各业务加速发展。

人才流动本应是商业社会的一种常态,也是这个社会保持创新力与活力的标志之一。但是,过往一段,可能是过去 20 年来,最为集中、频次最高、影响最大的一幕。在它背后,到底是迷狂还是商业理性,是否有着更广的社会原因?

三、隐藏在背后的逻辑:行业与经济

首先,就是全球经济疲弱带来的危机感,中国经济也在L形态中承压,许多企业尤其科技企业都经历着考验。

就连 BAT 都是如此,它们的财报数据虽然也有成长,但更多是春秋笔法。比如阿里更多是资本运作获得成长,它的电商主业尤其淘宝成长大幅下滑。百度则同时备受业绩增速和商业道德拷问,有被剔除出 BAT 之忧。腾讯的最新财报也显示广告业务环比下滑严重。这背后有人口红利的消失背景,它导致纯粹靠新增用户带来流量经济失去效应。

为了化解危机,互联网业日益需要那种能够激活存量用户、挖掘大数据价值的人才。因此,网红经济快速崛起。网红最大的角色,就是通过娱乐化模式为平台导流,形成一个个社交圈层,并体现垂直服务特色。这也是互联网流量经济的再造。

除了网红,还有名流效应。许多互联网公司甚至传统科技企业还开始拉拢那种行业外名流。他们超越行业限制的大众品牌影响力,能够产生更多名人效应,并带动商业转化。你能从张艺谋、高晓松、黄健翔、邓超、何炅、李湘的动向中体会到。

其次,上市公司股价压力也是人才流动重要原因。阿里、乐视最典型。自从 IPO 之后,阿里大面积调整了管理团队,甚至连 CEO 也迅速更换成职业经理风格更浓的逍遥子张勇。随着更多职业经理味道的中层加入。有业内人士表示,这某种程度上是阿里为股价、数字而战的体现。职业经理比阿里那些崇尚所谓价值观的老人,往往更注重短期业绩。

再者,全行业都面临着技术创新的压力。后摩尔定律时代,底层技术研发遭遇瓶颈。在新的工艺、材料出现重大变革前,整个产业开始寻求挖掘前代或成熟技术价值。这种动向体现在人才诉求上,就是那种具有商业思维、有通路优势、能触达消费者的人才的舞台。

当然,其中更反映出来巨大产业融合的背景趋势。

一是互联网与实体经济的日益融合,“互联网+”成为社会思潮。市场更需要既有互联网思维又有实体模式运营经验的人才。阿里针对苏宁、京东针对永辉超市的挖角与投资,以及万达高薪挖角互联网人才,都带有对流的特征。而乐视的生态化反,虽有许多夸张,但从贾跃亭的理念来说,确实也有许多合理的部分。他认为,未来,真正巨大的变革会发生在行业之间的交汇地带。乐视在互联网汽车、体育等领域的布局,都带有跨界的用意。贾跃亭对人才的诉求,自然就会有不同于其他许多互联网企业的风貌。二是未来的社会,是万物互联,需要打破行业壁垒,共享数据。因此,那种具有技术或融合方案经验的行业人才,尤其是云计算的人才,就成了香饽饽。最近,滴滴成功挖角阿里云最牛的技术专家,就体现了这一点。

政策当然也在引导人力流动。在大众创业、万众创新的氛围里,新创公司或项目,他们急需人才填充,定点挖角巨头或者行业里的好手,就成了一种“去中心化”的趋势。中国太多人才集中于 BAT 以及众多大公司、跨国公司,随着行业演进,他们在其中发挥的空间有限,开始出现大规模分流。当它与政府倡导的上述政策碰撞后,就会促成一个打破巨头人才垄断、空耗整个社会人才的趋势。这应该是大众创业、万众创新的人才建设价值。

但人才大规模流动,也值得我们反思。主要有两重。一重是我们过去的人才培养观念。中国学科细分,过去培养了大量专业型人才,它适应了改革开放后、一个工业体系日益细密的中国,适应了一个海外高度发达的水平产业分工大潮。但当科技行业内部发生整合、尤其 ICT 领域开始融合的周期,那种复合型的技术与商业人才更受关注。

这种动向,其实反映了中国教育、人才培养体制的困惑。人才流动的背后,有对这种体制的反叛。

挖角种种,更有充满迷狂一面。许多带有短期功利心,不但会破坏现有生态,造成产业震荡,也会导致被挖角的人力最后落入尴尬,成了工具与棋子,甚至炮灰。尤其是经济下行,上市公司业绩压力沉重局面下,企业的挖角就更值得深思。

后人才时代,如何解决人才冗余造成的内部竞争和人才成本,都会成为企业面临的问题。而对于那些在企业发展初期进入公司的传统型技术人才或者渠道型资源人才,随着公司的战略调整,地位难免不被后来者冲击,这些,也是当初被许以高薪和未来的人才们该担忧的事情了。

互联网让整个商业氛围都活跃了起来,也让人的价值得到了前所未有的放大。显然,这场以人才为争夺对象的“权力的游戏”还将继续进行下去,甚至会有更多的人参与进来。

斯坦福大学教授理查德·帕斯卡尔说过一句名言:“21 世纪,没有危机感是最大的危机。”你随时都可能被封为诸侯,也随时有可能会被砍下脑袋。争夺“铁王座”的道路,还凶险得很,没有一个人可以不小心。

.NET 开源开发项目

本文列出了 .NET 开源开发项目(open source developer projects)。意在包括对开发过程的所有方面有所帮组的项目。对于消费项目(consumerprojects),请参阅.NET开源消费项目清单。

下面按字母排序,并提供一行文字说明。GitHub/CodePlex(或其他)链接优先。

  • .NET 实现
    • .NET Core – Core .NET 框架
    • C# Native – 把 C# 编译成本地代码。
    • Cosmos – C# 开源的管理操作系统,一个操作系统是“construction kit”。
    • Fling OS – C# 操作系统 designed for people to learn low-level development from.
    • Mono – .NET Framework 跨平台(Cross-platform)的实现。
    • MOSA Project – 管理操作系统联盟项目 – C# Operating System.
    • SharpLang – 把 C# & .NET 编译成本地机器码,使用 LLVM 作为后台。
  • 平台
    • Castle Project – Umbrella project for ActiveRecord, DynamicProxy, MonoRail, Windsor
    • KonfDB – Configuration Management as a Service for cross-platform, multi-tenant enterprise/hobby applications.
  • 语言
    • Boo – 一个类似 Python 的 .NET 语言,但它是静态类型(static typing),以及很多元编程(meta-programming)功能。
    • ClojureCLR – Clojure 编程语言的 .NET 实现,构建在 DLR。
    • Cobra – 整洁、高级语法(Boo/Python-like)。静态和动态绑定(Static and dynamic binding)。一级类支持单元测试和契约。用脚本执行编译的便利性。Lambda 表达式和闭包(closures)。扩展(Extensions)和混入(mixins)。
    • Dynamic Language Runtime – 用 .NET 构建动态语言的工具。
    • Eagle – Tcl 编程语言的一个 .NET 实现,构建在 CLR。
    • F# – 一个成熟、开源、跨平台、functional-first 编程语言。是 ocaml 语言在 .NET 下的实现。
    • F* – An ML-like language with a type system for program verification.
    • IronPython – Python 编程语言的一个 .NET 实现,构建在 DLR。IronPython Site.
    • IronRuby – Ruby 编程语言的一个 .NET 实现。构建在 DLR。IronRuby Site.
    • IronScheme – A R6RS conforming Scheme-like implementation based on the Microsoft DLR.
    • Irony – a development kit for implementing languages on .NET platform
    • NiL.JS – A .NET implementation of the ECMAScript language and runtime.
    • Phalanger – full-featured PHP runtime & compiler for .NET/Mono frameworks. Phalanger is modern open-source implementation of PHP, compatible with the vast array of existing PHP code.
    • Roslyn (.NET Compiler Platform) – Open-source C# and Visual Basic compilers with rich code analysis APIs.
  • 安全/ 识别管理
    • Thinktecture IdentityManager
    • Thinktecture IdentityServer
    • SKGL – Serial Key Generating Library
  • Web CMS
    • DNN (formerly DotNetNuke) – Web 内容管理平台(CMS)。
    • N2CMS – Open source, lightweight, code-first CMS able to seamlessly integrate into any MVC project.
    • Orchard – 一个聚焦社区内容的管理系统(community-focused Content Management System),构建在 ASP.NET MVC 平台。
    • Piranha CMS – 对新的和现存的 ASP.NET MVC & WebPage 应用程序的轻量级 CMS 库。
    • Suave – 一个轻量级 Web 服务以及一套操作路线流(route flow)和任务组合(task composition)的组合器。
  • Web 框架
    • Nancy – A lightweight, low-ceremony, framework for building HTTP based services on .NET and Mono.
    • NemerleWeb – Web MVVM library for .Net. It uses reactive data model which allows creating rich internet applications.
  • ADO.NET 提供者
    • Firebird .NET client – Firebird
    • Npgsql – PostgreSQL
    • System.Data.SQLite – SQLite
  • 消息队列
    • AzureNetQ – An easy to use .NET API for Azure Service Bus.
    • EasyNetQ – An easy to use .NET API for RabbitMQ.
    • Lime – 一个轻量级的消息队列库。
    • RestBus – 一个 .NET 的简单异步消息和队列。
    • Albedo – A .NET library targeted at making Reflection programming more consistent, using a common set of abstractions and utilities.
    • Algorithmia – 算法和数据结构(Algorithms and Data structures)。
    • AngleSharp – 尖括号解析库(Ultimate angle brackets parser library)。它解析 HTML5、MathML、SVG 和 CSS 以构造基于官方 W3C 规范的 DOM。
    • ArcGIS.PCL – 调用 ArcGIS Server REST API 资源。也可以在 ArcGIS 功能与 GeoJSON 之间转换。
    • Argument – Argument validation microframework that does one thing in the simplest way possible.
    • Bing.RestClient – 从一个统一的客户端访问 Bing REST APIs。
    • BoxKite.Twitter – 针对 1.1 Twitter的API 的 Twitter .NET 客户端库,结合 REST API,用户流和搜索流。使用 Rx(Reactive Extensions)。
    • Brighter – A Command Dispatcher and Command Processor library with support for Work or Task Queues over different MoM implementations such as RabbitMQ
    • Cimbalino Toolkit – A set of useful and powerful tools that will help you build your Windows Platform applications.
    • Coding4Fun Toolkit
    • ColoredConsole – 向你的控制台添加一些颜色。
    • ColorSharp – 处理颜色空间(color spaces )和光频谱(light spectrums)的库。
    • ComparerExtensions – 使用自然语言语法(natural language syntax)构建 IComparer 和 IEqualityComparer 对象。
    • Cricket – Actor 库。
    • DiffSharp – 自动化差异库(Automatic Differentiation Library)。
    • DotNetOpenAuth – Library that adds support for your site visitors to login with their OpenIDs by just dropping an ASP.NET control onto your page.
    • DropboxRestAPI – DropBox .Net 客户端库。
    • DynamicData – 赋予集合 Rx 的强大功能。
    • ExtraLINQ – .NET 集合的各种扩展方法。
    • FeatureToggle – Simple, reliable feature toggles in .NET.
    • FluentBootstrap
    • FluentConsole – 向控制台添加颜色的另一个方法(FluentConsole.Red.Text().Green.Text())。
    • FluentValidation – A small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules.
    • GongSolutions.Wpf.DragDrop – A drag’n’drop framework for WPF.
    • GeckoFX – Mozilla’s Gecko layout engine wrapper in .NET.
    • HudlFfmpeg – A/V transcoding framework that helps build complex FFmpeg commands.
    • JSON.NET – Popular high-performance JSON framework for .NET
    • Kentor.AuthServices – A SAML2 Service Provider for .NET.
    • LibGit2Sharp
    • Lucene.Net
    • MahApps.Metro – 创建 metro-style WPF 应用程序的一个工具。
    • Math.NET Numerics – 提供科学和工程以及每天使用的数字计算的方法和算法。
    • Mathos Core Libary – 提供金融、统计、模式识别(pattern recognition)等等方面数字计算的一个算法库。
    • Mathos Parser – A simple parser for mathematical expressions before and at runtime.
    • Mjolnir – Hystrix-inspired fault tolerance with circuit breakers and thread pools.
    • NAudio – 一个开源 .NET 音频(audio)和 MIDI 库。
    • NetTopologySuite – A .NET port of the JTS Topology Suite.
    • NHunspell – Spell Checker, Hyphenation an Theasaurus
    • NModbus4 – Modbus 协议的实现。
    • NodaTime – 针对 .NET 一个更好的日期和时间 API。
    • NPOI – 针对 .NET 一个 Office 文件格式(xls, xlsx, docx)读/写库。
    • OneDriveRestAPI – OneDrive .Net 客户端库,使用 REST API。
    • OsmSharp – Mapping & Routing 库。
    • PocketSharp
    • PortableRest – Portable library for building cross-platform REST API Clients for .NET and Xamarin.
    • RestSharp – 针对 .NET 简单的 REST 和 HTTP API 客户端。
    • SharpMap – An easy-to-use mapping library for use in web and desktop applications
    • SharpSnmpLib – An easy-to-use SNMP library for use on all platforms (.NET/Mono/Xamarin)
    • Splat – A library to make things cross-platform that should be.
    • SSH.NET – 一个 SSH, SCP 和 SFTP 客户端库。
    • SuperSocket – An extensible socket server engine which supports .NET and Mono
    • WebApiProxy – An automatic proxy provider for RESTful services built on ASP.NET Web API. Includes JavaScript & C# client generation.
    • WebSocket4Net – 一个针对 .NET, Mono 和 Xamarin 的 C# websocket 客户端。
    • WpfToolkit – Fork of the MS WPF Toolkit
    • XamlEssentials – Collection of helpers for Microsoft’s XAML platforms.
    • Zlib.Portable – A Portable Class Library port of the Zlib library from http://dotnetzip.codeplex.com.
  • 数据挖掘 / 数据提取 / 机器学习 / 人工智能
    • AForge.NET – 为计算机视觉(Computer Vision)和人工智能(Artificial Intelligence)领域的开发人员和研究者设计的 C# 框架,包括图像处理(image processing)、神经网络(neural networks)、遗传算法(genetic algorithm)、机器学习(machine learning)、机器人(robotics )。
    • Nepy – A collection of NLP parsers for .NET
    • SharpNLP – SharpNLP is a collection of natural language processing tools written in C#
    • Toxy – An data/text extraction framework for .NET, similar to Tika in Java.
  • 图像 & 服务端图像处理
    • ImageProcessor – A .NET Library For On-The-Fly Processing Of Images (GDI+ based).
    • ImageResizer – Add commands to image URLs to get altered versions in milliseconds. Edit, filter, touch-up images in real-time. (multiple backends – FreeImage, C++/CLI, GDI+, WIC). 45+ plugins available.
    • King.Azure.Imaging – Scalable image uploading and processing for Azure.
    • MonoGame – MonoGame is a cross-platform, open-source implementation of the XNA Game Framework.
    • .NET Image Processor – Extensible, chainable image processing library (GDI+ based).
    • OpenTK – OpenTK is a low-level, cross-platform binding to OpenGL, OpenGL ES, OpenCL and OpenAL, available for Windows, Linux, Mac OS X, BSD, Android and iOS.
    • SharpDX – SharpDX is a project delivering the full DirectX API for .NET on all Windows platforms.
  • 日志
    • Exceptionless – Provides real-time .NET error reporting for your ASP.NET, Web API, WebForms, WPF, Console, and MVC apps. It organizes the gathered information into simple actionable data that will help your app become exceptionless!
    • ELMAH – ELMAH (Error Logging Modules and Handlers) is an application-wide error logging facility that is completely pluggable. It can be dynamically added to a running ASP.NET web application, or even all ASP.NET web applications on a machine, without any need for re-compilation or re-deployment.
    • log4net – A tool to help the programmer output log statements to a variety of output targets.
    • LogMaster4Net – It is a central log server which can organize your logs in different applications in a same place but have same log behaviors (loggers, appenders, levels and rules) like in the indepedent applications before.
  • Model-View-ViewModel (MVVM) 框架
    • Caliburn Micro – A small, yet powerful framework, designed for building applications across all XAML platforms.
    • Catel.MVVM – Catel is an application development platform with the focus on MVVM.
    • MVVM Cross – A cross-platform mobile MVVM development framework.
    • MVVM Extensions – MVVM cross platform (.NET FW 4.5, WPF, Windows Runtime/Phone) extensions for .NET with support for async commands, MVVM-friendly Object and Task with support for UI notification.
    • MVVM Light Toolkit – A cross-platform desktop and mobile MVVM development framework.
    • Okra App Framework – An MVVM framework for Windows Store applications including MVVM templates for Visual Studio.
    • ReactiveUI – An MVVM framework that integrates with the Reactive Extensions for .NET to create elegant, testable User Interfaces that run on any mobile or desktop platform.
    • Simple Mvvm Toolkit – Provides a simple framework and set of tools for getting up to speed quickly with applications based on the MVVM design pattern.
    • WPF Application Framework (WAF) – A lightweight Framework that helps you to create well structured WPF Applications. It supports you in applying a Layered Architecture and the Model-View-ViewModel pattern.
  • 工具
    • Cake (C# Make) – A build automation system with C#/Roslyn driven build scripts.
    • CppSharp – C/C++ bindings generation for .NET.
    • CInject – A tool to inject your C#/VB.NET code into existing .NET assemblies and executables
    • FAKE – Build automation system with capabilities which are similar to make and rake.
    • Fody – Extensible tool for weaving .NET assemblies.
    • Crawler-Lib Build Tools – A PowerShell based toolbox for automating the software build process, autmated testing and integration.
    • FsEye – A visual object tree inspector for the F# Interactive.
    • FsharpLint – Lint tool for F#.
    • FsPickler – Serialization library that facilitates the distribution of .NET objects.
    • GitLink – Command-line tool to make .NET open source accessible without the need for a symbols server
    • GitVersion – Use convention to derive a SemVer product version from a GitFlow based repository.
    • Glimpse – Providing real time diagnostics & insights to the fingertips of hundreds of thousands of developers daily.
    • ILSpy – ILSpy is the open-source .NET assembly browser and decompiler.
    • Mini Profiler – A simple but effective mini-profiler for .NET.
    • Obfuscar – MSIL obfuscation utility for .NET assemblies.
    • Outcomes.Net – Fluent wrapper that eliminates plumbing code around failure-prone functions.
    • Paket – Dependency manager for .NET and Mono projmects, which is designed to work well with NuGet packages and also enables referencing files directly from GitHub repositories.
    • Protobuf-net – A .NET implementation of protobuf, allowing you to serialize your .NET objects efficiently and easily.
    • scriptcs – scriptcs makes it easy to write and execute C# with a simple text editor.
    • Snoop WPF – Snoop – The WPF Spy Utility
    • Sql Bulk Copy Sync
    • Vagrant – Automated dependency resolution and dynamic assembly compilation framework.
    • Waf DotNetPad – The Waf DotNetPad is a simple and fast code editor that makes fun program with C# or Visual Basic.
    • Weighted Selector – Easy to use (but high performance!) weighted selection implementation.
    • XDav – A .net server mudole for webdav standard.
    • ZeroToNine – A tool for maintaining .NET Assembly versions across multiple files.
  • 测试
    • AutoFixture – An open source framework for .NET designed to minimize the ‘Arrange’ phase of your unit tests. Its primary goal is to allow developers to focus on what is being tested rather than how to setup the test scenario, by making it easier to create object graphs containing test data.
    • canopy – A web testing framework.
    • FakeItEasy – The easy mocking library for .NET.
    • Fixie – A low-ceremony, convention-based testing framework with flexible customization.
    • FsCheck – A tool for testing .NET programs automatically.
    • moq – The most popular and friendly mocking framework for .NET
    • NSubstitute – A friendly substitute for .NET mocking frameworks.
    • NUnit – NUnit is a unit-testing framework for all .NET languages.
    • tickspec – A lightweight Behaviour Driven Development (BDD) framework.
    • TestStack.BDDfy – BDDfy is the simplest BDD framework to use, customize and extend!
    • TestStack.FluentMvcTesting – Simple, terse, fluent unit testing for ASP.NET MVC Controllers.
    • xUnit – xUnit.net is a community-focused unit testing tool for the .NET Framework.
  • 依赖注入
    • Autofac – Autofac is an addictive Inversion of Control container for .NET 4.5, Silverlight 5, Windows Store apps, and Windows Phone 8 apps.
    • Castle Windsor – A mature Inversion of Control container available for .NET and Silverlight
    • DI Feature Tests – Tests that track commmon DI features among multiple containers
    • dI.Hook – DI container that allows invocation using AOP
    • DryIoc – DryIoc is small, fast, capable IoC Container for .NET
    • fFastInjector – fFastInjector is a high-performing dependency injector, service locator, and/or IOC (inversion of control) container.
    • Funq – A fast DI container you can understand.
    • Grace – Grace is a feature rich Dependency Injection container in a portable class library
    • Griffin – Inversion of control container with (almost) zero configuration
    • HaveBox – HaveBox is a very fast and lightweight IoC containter. The goal is to keep it fast and light, and at the same time easy to use.
    • Hiro – An ultra-lightweight, inversion of control container compiler framework
    • IfInjector – High performance mobile micro-IoC container.
    • LightCore – A lightweight dependency injection container that can be used as a service locator and despite its simplicity and ease boasts numerous features.
    • LightInject – A ultra lightweight IoC container
    • MicroSliver – MicroSliver is a micro, non-bloat, non-intimidating and speedy .NET (ASP.NET, Silverlight, RIA Services, WPF, Forms and Met
    • Ninject for Desktop – Dependency injector for .NET
    • Ninject for Portable Class Libraries, Universal apps and Xamarin
    • QuickInject – QuickInject is a Unity 3.5 based IoC container that aims to give the Unity container a performance advantage in basic scenarios.
    • Simple Injector – Simple Injector is an easy-to-use Dependency Injection library for .NET 4+ that supports Silverlight 4+, Windows Phone 8, Windows 8 including Universal apps and Mono.
    • Spring.NET – Spring.NET is an open source application framework that makes building enterprise .NET applications easier.
    • StructureMap – StructureMap is a Dependency Injection / Inversion of Control tool for .Net that can be used to improve the architectural qualities of an object oriented system by reducing the mechanical costs of good design techniques.
    • TinyIoC – An easy to use, hassle free, Inversion of Control Container for small projects, libraries and beginners alike.
    • Unity Container – The Unity Container (Unity) is a lightweight, extensible dependency injection container with optional support for instance and type interception.
  • 数据访问
    • Dapper – Dapper is a single file you can drop in to your project that will extend your IDbConnection interface.
    • Eggado – Eggado takes generics, lambdas, expression trees, dynamic methods and DLR and uses them to breathe new life into data access using good old ADO.NET. It’s for folks who can live with a SQL dialect.
    • King.Mapper – High performance model mapping.
    • linq2db – Lightweight ORM and LINQ provider with support for various databases including MS SQL, PostgreSQL, Oracle and MySQL
    • NHibernate – Object Relational Mapper
    • Simple Data – A light-weight, dynamic data access component for C# 4.0.
    • Sqlite-net – Simple, powerful, cross-platform SQLite client and ORM.
    • NMEA Parser – Library for handling NMEA message in Windows Desktop, Store, Phone and Xamarin (Android + iOS), coming from files, Bluetooth, serial port or any stream.
    • Neyro.Data – Tiny, simple and fast ORM.
    • StackExchange.Redis
    • LINQ2DynamoDB – A type-safe data context for AWS DynamoDB with LINQ, in-memory caching and OData support.
  • 游戏
    • Duality – An Open Source 2D Game Engine + Visual Editor written entirely in C#.
    • MonoGame – One framework for creating powerful cross-platform games.
    • OpenRA – An open-source implementation of the Command & Conquer: Red Alert engine using .NET/Mono and OpenGL.
    • Paradox – Paradox is a versatile and engaging game engine.
    • WaveEngine – A powerful component based game engine for desktop and mobile platforms using C#.
  • UI 和 Control 库
    • Callisto – 针对 WinRT 应用程序的 UI 控制工具。
    • Dragablz – A tearable TabControl for WPF which also provides easy-to-use and implement docking features.
    • Eto – Cross platform GUI Toolkit for desktop and mobile apps
    • Material Design in XAML Toolkit – WPF/XAML resources, styles & templates for creating applications using Material Design
    • Mono XWT – A cross-platform UI toolkit for creating desktop apps
  • Windows 服务
    • King.Service – 针对 Azure 和 Windows 的任务调度。
    • TopShelf – An easy service hosting framework for building Windows services using .NET.
  • 调度
    • Hangfire – An easy way to perform fire-and-forget, delayed and recurring tasks inside ASP.NET applications.
    • Quartz.Net – A full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems.
  • 部署
    • DropkicK – A fluent deployment library for Windows applications
    • RoundHouse – RoundhousE is a Database Migration Utility for .NET using sql files and versioning based on source control
  • 服务总线(Services Bus)
    • King.Service.ServiceBus – 针对 Azure 和 Windows Servers 的任务调度:服务总线(Service Bus)。
    • Warewolf Easy Service Bus – An open source easy to use service bus, built on numerous .Net technologies including WF (Windows Workflow Foundation), SignalR and WPF.
  • 分布式缓存和计算
    • CacheAdapter – a .Net library allows developers to use unified-implemented cahce provider
    • Dache – An open source distributed caching service, built on .NET 4.0 and using TCP sockets for communication.
  • Windows 工作流
    • Workflow Extractor – Document Windows Workflow logic into a Word document or Excel sheet.

This list is just a starting point – alsotake a look at all the projects on CodePlexand on GitHub Trending C#.

原文地址:https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md