题图来自于NextDay
友情提示:本文有4000多字,篇幅比较长。
前几天有个朋友发来消息:
「从做业务咨询顾问角度,有什么入门的SQL 的书推荐嘛?」
Ding:这个不存在什么角度啊,你找本 SQL 入门就好了。你用哪种数据库?就找你用的数据库对应的入门书
友:Emmm,开发的同事给我装了PLSQL Develop(应用程序图标截图)
Ding:这个是客户端软件,你们应该用的是 Oracle ,Oracle 的基础知识你了解过吗
友:没啊
Ding:没有的话,先看 Oracle 入门吧,Oracle 跟 SQL Server 有些语法不一样的
友:两种数据库?为撒要先了解 Oracle?
Ding:Oracle 跟 SQL Server有些语法不一样的
友:问下啊,如果数据库是 Oracle, 为撒他们都是执行SQL呢
Ding:(突然反应过来)你是不是没搞清楚 SQL 和 数据库的区别。。
回过神来,我突然意识到,Ta 缺的不是 SQL 入门,而是数据库入门,似乎也不对……缺的是对全局的知识体系的概念。
我试着回忆了下 Ta 想要入门 SQL的缘由。再早几日,Ta 也曾求助过我,作为业务咨询顾问新手,有个迫切的需求——「有没有那种讲前台界面操作,然后教怎么看后台数据库变化的书啊」。
印象中没有看到过类似的,于是我建议 Ta 最好是自己去搭一个环境跑一跑,最直观。大概跑的时候意识到自己需要恶补一下 SQL 的知识,于是就有了开头这一通对话。
当时我并没有在意,或者说没有引起我的注意,甚至觉得有点不可理解,有种「还没学会走就想跑」的感觉(表打我🤦♀️),但今天这番对话结束,让不得不承认,这是让很多新手最困惑的地方,或者说,连入门都觉得有点“无从下手”。
所以,接下来,我想尝试用这个例子,来说一说我对于「如何入门」的一些心得体会。
首先我们来了解一下「业务咨询顾问」是做什么的,最快的方法就是去招聘网站搜一搜,以下是我用「IT + 业务咨询」搜到的比较相近的一个职位「高级业务咨询顾问(SAP FICO)」的 JD(职位描述)
职位描述:
1、负责对客户进行有关 FICO 项目的售前、培训、实施及客户服务等工作;
2、针对客户需求和行业特点,提出基于 FICO 的解决方案;
3、依据项目要求,负责 FICO 的实施工作:需求分析、业务流程优化、方案设计、系统测试和上线。
岗位要求:
1、5年以上 FICO 实施顾问经验,5个以上 FICO 完整项目实施经验,熟悉相应模块的业务流程及配置,能够独立完成项目的实施;
2、熟练掌握 FICO 能做 Consulting 工作,具有良好的业务背景;
3、具备出色的实施能力和团队意识,能够与公司其他顾问一起顺利完成项目任务;
4、出色的沟通能力,以客户需求为导向,完成对最终用户或关键用户培训;
5、良好的适应能力和抗压能力,可以适应出差。
注:FICO 是 SAP 中的财务模块,SAP 是一个庞大的 ERP 系统。
从职位描述中可以看出,业务顾问的主要工作是负责某个系统/模块的售前售后服务,既要能够提供需求方面的顾问服务,也要能够协调落地实施,最后还要负责后续的更新维护,有点类似项目经理,区别是,业务顾问涉及的生命周期更长,需要更熟悉业务流程,因此也需要有更强的沟通转换能力,即,把实际的业务需求转换为系统开发需求。业务顾问一般不会要求具备编程开发能力(在我的认知范围内),但需要对系统非常熟悉。
再简单介绍一下这位朋友的基本情况,非计算机专业毕业,不具备技术研发能力,此前担任过一段时间的 IT 系统项目经理,转型业务咨询顾问没多久,符合我们标题中设定的「跨专业」和「新手」这两个属性。
我这位朋友参与的系统模块的主体功能已经在正常运行中,也就是说,系统本身已经是比较成熟的了,于是 Ta 日常的职责更多的是收集客户对于现有功能的改进意见以及协调新增的开发需求。那么,无论是跟客户还是研发团队沟通,系统中数据流转都是绕不开的一个难点,客户提供的需求一般侧重于「输出」,即,希望得到一个什么样的结果,而研发团队需要的是「输入 -> 输出」的完整链条,那么作为沟通桥梁的 Ta ,首先自己要搞清楚这个链条是怎么一回事。
举个例子,前台界面上用户点击了一个「提交订单」按钮后,从前端到后台,究竟发生了什么样的变化。从用户体验的角度,也许是秒级响应,如此短的反馈速度,总是会给人一种错觉,是不是系统做的工作非常少,恰恰相反,正因为系统做了大量的工作,才能让这个操作的响应时间可以缩短到秒级,最典型的例子,就是淘宝双十一。
前端界面,不论是 APP 还是网页,或者小程序,很多时候只是一个载体,甚至只是用作显示。数据持久化多数放在后台来做,持久化离不开数据存储和获取,传统的关系型数据库(Oracle, SQL Server, MySQL)是一种方式,还有我们常见的 Redis 等非关系型数据库。数据是怎么从前端到达数据存储区,然后又是发生了什么变化之后再回到前端的呢?
这个问题看起来很复杂,但对新手来说,的确是一个很好的「入门路径」,帮助新手理解这个系统是如何运作的,我们可以从中抽取一个相对简单的功能,抽出一条「从前到后」的脉络,之后就能举一反三,其他功能点也不在话下了。
但因为要摸清脉络,最直观的方法是直接动手编写代码,次之是查看已有代码。这里考虑到朋友不具备编程知识,我们采用「查看代码」的方式。
因为购物订单涉及到交易,逻辑比较复杂,我们这里举一个最最简单的例子——「签到领积分」。
功能描述:用户目前积分是100点,点击「签到」后,积分显示为110点,这里暂不考虑「连续多天奖励」的机制。
假设前端载体是一个网页,那么打开网页源代码查看,找到「签到」按钮附近的代码,这里用简单的 button 控件做个示例:
<input type="button" id="button1" onclick="clickMe()" value="签到" />
不难理解,clickMe() 是点击按钮之后会触发的方法,我们同样来先写一个简单示例:
<script type="text/javascript">
function clickMe()
{
alert("签到按钮被点击了")
}
</script>
那么,用户点击按钮之后,会弹出一个系统提示框,显示「签到按钮被点击了」。考虑到这里要演示前后端交互,那么我们需要引入「接口」的概念,也就是我们经常听程序员们说的 API (Application Programming Interface,应用程序接口),前端到后端的一次交互,我们可以简单粗暴地理解成一次 HTTP 请求(这里暂不考虑 Socket 等其他协议),通过这次请求,相当于是前端带着一些数据去呼叫后台,后台收到数据之后,将处理结果再返回给前端。我们改写一下前面的 ClickMe() 方法:
<script type="text/javascript">
function clickMe()
{
$.ajax({
type: 'POST',
url: url, //后台提供的 API 地址
data: data, //前端传递的数据
success: success, //成功后的处理方法
dataType: "json" //要求返回 JSON 数据格式
});
}
</script>
AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示。
摘自 w3school.com.cn
我们现在并不需要知道 AJAX 的原理,只需要知道 AJAX 是用来通过 HTTP 向后台提交请求的就可以了。其中「data」是前端网页需要提交给后台的数据,在「签到」这个场景下,我们需要知道是哪个用户来签到,不考虑 session 管理或者安全性规则的情况下,只需要把「用户编号」告诉后台即可,于是我们在 data 处把用户编号放进去。
那么,后台收到这个请求之后,同样也会有一个对应的接收方法,我们这里用一段 JAVA 伪代码做示例(仅作为功能演示,不包含异常和合法性判断)
public String OnRequest(HttpServletRequest request, HttpServletResponse response, HashMap<String, String> args, HashMap<String, String> cookies) throws Exception {
// 从 args 中取出前台传递过来的数据
String userId = args.get("userId");
// 通过 userId 去查询用户,并获取现在的积分(假设积分是整数)
User usr = FindByUserId(userId);
// 叠加本次签到的积分
usr.userPoint = usr.userPoint + 10;
// 保存到数据库
SaveUser(usr)
// 将结果封装后返回给前台
return FormateResult(usr);
}
其中 FindByUserId() 这个方法的作用则是去数据存储中去取这个用户的当前积分数,也许是数据库,也许是缓存,那么我的这位朋友,需要看到数据库是怎么变化的,就需要再切入到 FindByUserId() 和 SaveUser() 这两个方法去看,从 SQL 的角度来看,这两个方法分别会包含一个最基本的 Select 语句和 Update 语,作用分别是查询和更新。
到这里还不算结束,我们再回到前端。还记得前面 ajax 方法中有个「success」吗?这个方法将用来处理从后台返回的数据结果,这里假设显示积分的是个 div 控件,obj 是后端返回的结果对象。
function success(obj)
{
// 根据后台的返回结果更新文本框内容
$("#myDiv").html(obj.userPoint);
}
至此,一个简单的用户「签到」功能的前后端交互就完成了(不包括异常和错误处理)。
是不是看上去,也没有那么想象中那么难懂?例子本身比较简单是主要原因,但更多的是因为,将复杂的交互过程拆分成了几个小步骤。 每个小步骤本身的功能点就比较清晰了,理解起来也就比较容易。
但其中涉及到的知识点非常多,比如异步请求、数据同步、数据校验等等,这些都会对整个交互过程产生影响,但为了举例说明交互的主脉络,本文中将这些内容都省略了,感兴趣的同学可以自己继续了解。
从这个例子中,我们可以看出来,跨专业的新手入门,关键是找到「一条主线」,就像是「小说中的主线和副线」,主线就是小说故事发展的主要大纲,副线就是小说故事主线的分支情节,一般主线贯穿全文,副线只是插曲。我们要能够迅速找到一条可以贯穿全文的「主线」,搞清楚「套路」,之后再去看其他逻辑就相对比较简单了。
同样的,读书的时候,书的目录也起到了「主线」的作用,我一般会花一点时间去看序言和目录,找到这本书的脉络,然后再去有重点的去看书中的内容,这样阅读的效率会大大提升,参见 筛选的重要性。
另外一个比较重要的点是,一定要实践,去请教业内人士也好,找一些现成的例子也好,要让自己能够掌握第一手的信息,比如网上有很多示例代码,代码是否健壮,是不是看得懂都没有关系,主要是通过看代码了解背后的逻辑。业界一直一句话「好的程序员每天能写出20行有效代码(也有说是100行的),就是世界级水平了」,因为代码的行数并不能代表能力,程序员的价值在于思考,而不在于打字数量。
我曾不止一次提到过「多元思维模型的重要性」,这也是查理·芒格一直在强调的,他认为掌握「重要学科的重要理论」是非常重要的,并且要「全部用上」。否则就像那句谚语说的:“在手里拿着铁锤的人看来,世界就像是一颗钉子。” ,「这是一种笨方法」。我们在学习跨专业的新学科的时候,抓住这门学科的大纲就是首要任务,你需要知道这门学科可以做什么或者解决什么问题,你才能更好地去学会这门学科。
写这篇文章的初衷,源自于我对这位朋友的一点“愧疚”,在起初 Ta 提出求助的时候,我并没有在意,甚至有点“轻视”这个问题。写着写着发现,能通俗地把这个问题解释清楚,也并非易事。整理成文,也算给有兴趣的朋友一个最基础的科普吧,感谢耐心看完的你❤️
旧文参考:
发送给作者