两年前,有几个出版社的编辑在QQ上跟我联系写书的事情,好奇为什么出版社会找到我这样一个很普通的.NET技术人员,其中一个编辑说他们分析了很多博客园博主的文章阅读量和写作质量,觉得我的博客还是不错的。尽管自己觉得自己写的博客不怎么样,但想着做了这么多年技术了,准备退居二线转行去创业,这个时候顺便写一本书作为技术生涯的总结到也不是坏事,于是和几位编辑沟通了一下,经过选题,最终和北航出版社签约写书。

此时时间是2018年8月,签了出版合同,我也辞了职,准备放松2个月再写。国庆好好玩了一圈正式开写,才发现写书和写博客根本不是一回事,而且当初签约的时候承诺要写25万字,就算每天写1000字都要写差不多一年,坚持了没几天就发现连续每天写1000字是几乎不可能完成的任务,写博客可以随便写,很容易候写1000字的水文出来;写书得写得有理有据,且不能粘贴太多代码,太多代码的书少那绝对是一本质量低劣的技术书。另外还有一个版权问题,编辑再三叮嘱版权问题与出版社无关,我不能抄袭别人写的内容。要不是我之前写了很多博客文章,完全靠自己写书的时候键盘现场敲25万字是难以想象的。于是赶紧跟出版社编辑沟通,编辑说不一定必须是25万字,不要比这个数少太多即可。听到这句话我心里稍稍安稳了下,于是整理了一个详细的写作目录,开始一章一章的写了。

第一章内容比较少,主要是程序员职业发展的问题,这些问题是我在CSDN论坛和各大技术QQ群里面收集到的一些讨论很多的问题,主要就是天天写CRUD程序的问题,这使得工作了很多年的程序员都难以得到发展。正好我写的是SOD框架的书,整个框架就是围绕着如何更快更加简单的做好CRUD的问题来的,要解决这个问题就不只是如何造一个ORM轮子或者如何使用流行的ORM框架的问题了,而是要深入到数据和编程的关系上来,要深刻的思考数和数据的本质问题,这样我在整个第二章花费了很多笔墨来写,最后发现这一章远超了我的预期,它占据整本书的篇幅比例有点大,有可能使得一本技术书不是一本严肃的技术书,偏离整本书的重心。后来书写完以后,果然责任编辑对此提出了较大异议,要将第二章作为“附录”处理放到书的后面去。为此我与编辑沟通了很多次,我用霍金写《时间简史》的时候他的朋友建议他这本书里面要尽量少用公式来举例,“书里面每多一个公式将损失一半读者”,技术书的核心在于用浅显的话语把晦涩的技术问题讲明白,而我的第二章是读者能把整本书读明白的关键。

第二章写的时间比较长,一方面是我对如何写思考了很久,另一方面也是自己写的不太擅长的领域,毕竟研究什么是“数”的问题是一个比较复杂的问题,需要从传统文化领域去找答案。我认同《广雅》里面对数的解释:数,术也。如果说前者是数抽象的概念、符号,那么后者就是数的计算过程,且两者互为一体,不可分割,就像太极阴阳的关系一样,拿我们写的程序来说,数与术的关系就好像“程序=数据结构+算法”的关系一样,所以说明白了什么是数,那么就更容易理解什么是数据结构,什么是算法,最后自然就理解什么是程序,以及要怎么样更好的来写程序了。为了验证我的思路,我大胆的向我儿子就读的小学班主任申请,来给他们班免费上几节“少儿编程”课,其中有一个环节就是让同学们模拟原始人在没有文字,甚至语言都还没有完整使用的情况下,怎么样来理解数的问题。上课的结果让我很惊讶,小学生的形象思维更加容易理解数这个抽象的概念,甚至他们连太极、阴阳、八卦这些概念都理解了,整个课上得生动有趣。当然,这几节课直到上完,我也没有讲任何程序语言的事情,我可不想让他们去赶时髦教他们学Python,尽管他们学校也有信息课,教了一点scratch,但我儿子说这玩意太幼稚了就是一个玩具,没什么意思。所以至今我只教了我儿子一点点Scheme语言,在数学课上学以致用。就这样,我在第二章中写了原始人学数字的故事,以及古代部落结绳记事的知识,用Lisp来表示结绳记事的过程,来辅助理解数的概念。既然小学生都懂得起这部分内容,相信读者朋友阅读这一章不会有太大的障碍。第二章还介绍了河图洛书以及八卦的演绎过程,可以作为感兴趣的朋友深入研究,这样能更好的理解关于数的“形象思维”。

第三章“数据库应用开发”和第四章“对象关系映射(ORM)”这两者的内容我研究的还比较深入,所以写起来不是难事,最重要的是我之前写的很多篇博客文章此时正好派上用场,但也不是直接复制粘贴过来就行,需要要系统化整理一遍,且不能粘贴很多代码影响阅读体验,所以必须帖代码的地方都能看到“此处代码略。。。"的情况。有SOD框架的老用户拿到后来我这本印刷出来的新书说这两章看起来”很熟悉、很亲切的感觉“,这说明SOD框架的”简单易用“特点非常受老用肯定。第五章“数据窗体开发”在现在Web应用流行的情况下,以及各种Web前端技术框架的大量使用下,这一章介绍的WinForm和Web Froms数据窗体开发技术显得有点“冷门”,但只要是用过的朋友都直到SOD框架对此的支持是很完善的,能够一行代码完成表单窗体的增删改查,且支持MVVM数据绑定。为了体现SOD框架非常易于开发数据窗体这个功能特点,所以尽管这一章内容不太多,但书中给的例子是我完全重新开始一步步手把手写的教程,其中的方法拿来即用,希望大家对Web Forms/WinFrom能够有新的认识。

第六章 “分布式系统架构与数据开发”算是我10多年架构工作经验的总结了,为了彰显书的主题,这一章里面介绍都是架构设计开发中跟数据密切相关的内容,包括分层架构的数据访问和处理,DDD/DCI架构、洋葱架构的一些概念,以及综合各种架构特点的“分布式混合架构”实战的内容。当然还包括企业应用中常见的数据分布式、分表分库、读写分离、分布式事务的知识,介绍如何用SOD框架来更简单的实现这些功能。第七章 “企业级解决方案应用示例”算是第六章的姊妹篇,他们都是基于我在以前公司负责的一些重点项目使用的技术架构方案的实践介绍,其中“应用层事务数据复制“方案PK过了原公司项目后期空降的海归总监基于Java+MySQL的技术方案,实践证明这个方案对比MySQL基于binlog实现的数据复制在开发难易度以及性能安全性方面更有优势。

最后一章做了一些框架的资源介绍,以及一份感谢名单,还有一份放到“后记”的写作感言。等到写完这一章,才发现自己已经写了整整一年时间,时间已经是2019年9月,写完发现居然已经超过了30万字(不包括英文代码和空格这些),差点不敢相信自己这样坚持下来了,用“掉了一层皮”来形容不过分,甚至像另外一个写书的朋友说的,写完一本书都“写秃顶”了(当然我头发天生很多)。

书写完了但写书的事情并没有完,上面说的只是写完了”草稿“,还需要自己校对以及编写书的前言、请朋友作序、写目录介绍等,其中有幸请到了.NET领域的标杆队长张善友同学和.NET Linux Web服务器Jexus作者”宇内流云“前辈做序,他们写完还差一位Java领域的专家支持,因为写书之前和出版社说好了”纯.NET的书不出“,市场上纯.NET的书比较少,出版社出于市场考虑不得不蹭热度出流行的书,比如Python的书如雨后春笋,以至于我这本书的上架建议写的是”大数据“类,虽然我觉得这个上架建议不太合适,但也没有更贴切的上架分类。最后终于请到了一个Java技术专家帮忙写了一篇序言,没想到他对我的书评价还不错,这让我有点意外。(参考他写的【序三】)。

一边约朋友帮忙写推荐,一边和出版社进行审稿校对。出版社要经过“三审三校”,流程复杂,与责任编辑的沟通过程“比较痛苦”,纠错别字都是小事,的问题是编辑觉得你有些地方写的不好,要进行删改,有些地方甚至要进行大段的删改,碰到这个事情你的心脏得要好才行。另外一个麻烦事情是要给出书中引用的图片和文字的完整来源,如果一开始没有注意这个问题到写书完了才来做这个事情是相当无语的,我在网上零星摘抄的文章部分内容大都找不到原来的网址了,编辑一再强调有版权问题“你自己负责”。事已至此,我自己负责就负责吧,身正不怕影子歪,我确实没有大段的抄袭过别人的文章,也没有使用过有版权的图片。稿件校审期间又遇上了两次新冠疫情,最后终于通过最后的校审了,时间已经到了2020年6月份才送印刷厂,等7月我拿到印出来的样书,距离最初完稿差不多又过了一年。拿到新书那一刻,已经完全没有了兴奋和喜悦的感觉,只是觉得这件事情终于告一段落了,当然还有后期结算稿费的事情,这里不表。这样,从签合同开始到最后上市,这本书差不多写了整整两年时间。

书写完书能不能卖出去成了新的问题,为此我建立了一个网站来宣传,给粉丝做售前售后服务,期间又是另一种心酸,这里先不表,感兴趣的朋友可以移步我的在线销售网站

最后就是我昨天去北京最大的新华书店--西单图书大厦,在四楼计算机图书区域,偶然看到我的书放到了“大数据”的书架上,有点“悲喜交加”的感觉,“悲”的是我辛苦两年写的书在电商平台销量并不好(当然跟我的销售策略失误有关),这两年写书对我创业和找工作带来了比较大的影响,把最重要的事情给耽误了; “喜”的是竟然能在线下书店特别是西单图书大厦看到“它”能在这里有一席之地,也心满意足了。

写了两年的一本.NET书现在终于在北京最大的新华书店上架了,然而我却很难找到工作了。的更多相关文章

  1. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  2. [No000058]一口气读完一本英语书

    个人:"如何学好英语?"99个人会回答:"去,读英文原著." 然而这事儿吧,恐怕比坚持背单词还难.无论少侠们背过多少单词,最后都会败在生词太多.句子太难的坎儿上 ...

  3. 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(八)

    [重构](续) 牌的表示: 一副牌有52张,可用一整数数组描述.但是由于在游戏过程中牌数在不断减少,所以用一表示剩余张数的整数和一整数数组共同描述.C99支持一种变量长度数组,但用在这里并没有什么特别 ...

  4. 我从LongAdder中窥探到了高并发的秘籍,上面只写了两个字...

    这是why的第 53 篇原创文章 荒腔走板 大家好,我是why. 时间过的真是快,一周又要结束了.那么,你比上周更博学了吗?先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面这图是我之前拼的一 ...

  5. 自己用js写的两个日历控件

    前一阵写了两个日历控件,做了简单的封装,发出来共朋友们参考. 第一个日历控件,条状的日历. (使用方法:调用initBarTime(id,evn),第一个参数是要渲染div的id,第二个参数是点击日期 ...

  6. 又写了两个实用的微信小程序

    忙里偷闲,最近又写了两个小程序. 一个是手机壁纸小程序,名字叫[来搜图],特点是界面干净清爽,没有多余的东西.开发这个是因为讨厌市面上那些壁纸app那样那么多的广告,真的太影响体验了.而且小程序更加轻 ...

  7. 如果只推荐一本 Python 书,我要 Pick 它!

    今年二月初,我偶然看到了一条推特: <流畅的Python>一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍 ...

  8. 4星|《JAC写给外贸公司老板的企管书》:善总结爱学习、有业绩的老外贸的经验谈

    作者从事外贸10余年,作出了业绩,也善总结.爱学习.爱分享.本书是作者在外贸行业的从业经验集.有一些战略方面的,比如开发小语种市场,大部分都是战术方面的操作细节(比如如何做营销),应该是非常适合从业者 ...

  9. 只推荐一本 JavaScript 书,你推荐哪本?

    嗨,我是 Martin.最近为了统一社区称谓,都换成 Martin Ager Adams. 前言 前端世界,技术层数不穷.尽管更新速度已经放缓,刚入门的票友总还是鸭梨山大. 前端三剑客 -- HTML ...

随机推荐

  1. 面经手册 · 第18篇《AQS 共享锁,Semaphore、CountDownLatch,听说数据库连接池可以用到!》

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  2. 5G革命:如何让「数据」实现最大性能?

    壹 早在2000年代中期,H-Store第一次在M.I.T.被我们提出来,VoltDB是H-Store的商业化产品,它表示结构相似的数据会被连续存放到一起.在本文的后续描述中,我们将使用V-H来缩写. ...

  3. php7的Opcache getshell

    OPcache基础 OPcache是一种通过解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从而大大提高了PHP的执行 ...

  4. 如何使用系统清理缓存软件优化MacBook

    在我们使用我们的Mac一定的时间后,总是不可避免的出现Mac内存不足的情况,所以清理垃圾软件也就成为了我们电脑里必不可少的软件.苹果软件商店中有很多各有不同的清理垃圾软件,但我们往往很难从这一大堆软件 ...

  5. Windows启用SSH命令

    前言 直接通过windows自带的CMD终端远程连接服务器,需要先安装好OpenSSH客户端. 安装 使用浏览器打开官网: https://www.mls-software.com/opensshd. ...

  6. C语言讲义——数组

    数组是: 一组数据 一组类型相同的数据 在计算机底层,数组是一块连续的内存 为什么使用数组? 一年12个月 int m1=1, m2=2, m3=3, ... 麻烦 数组示例: #include &l ...

  7. Java基础教程——内部类

    内部类 内部类(inner class)是定义在另一个类中的类 内部类的好处: |--1.隐藏机制:内部类封装性更好,隐藏在一个类之中,同一包中的其他类也不能访问 |--2.内部类可以访问外围类的私有 ...

  8. Java集合【3】-- iterable接口超级详细解析

    目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...

  9. Spring Cloud 学习 (十) Spring Security, OAuth2, JWT

    通过 Spring Security + OAuth2 认证和鉴权,每次请求都需要经过 OAuth Server 验证当前 token 的合法性,并且需要查询该 token 对应的用户权限,在高并发场 ...

  10. 推荐系统实践 0x0b 矩阵分解

    前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...