关于软件实施工程师的面试题有哪些

img

题外话:如果你想向我咨询软件实施工程师相关问题,我会劝退。非万不得已不建议转岗,能做开发就继续做开发。

在公众号龙腾万里sky回复软件实施即可获取一份本人精心自制的 PDF 文档一份,不定期更新优化。

tips:图片资源可能被防盗链(寄)了,可以右键属性复制地址在地址栏查看哈。

关于软件实施工程师的面试题,我个人也总结了一些,仅供参考。需要对主流 DBMS 厂商发行的数据库软件,例如Oracle、MySQL、SQLserver以及国产数据库DM(达梦)有所了解,并能够熟练部署运用。

如果具备一些服务器方面的知识,比如 Windows Server 和 Linux 服务器相关知识。熟悉 Linux 基本维护是加分项,这里所说熟悉指至少熟练运用 Linux 基本命令与常用命令,软件管理部署,基本权限,系统维护。

如果你想支持小站持续发展,可以在文章尾部进行赞赏哟

絮絮叨叨

说实话,目前软件实施这个行业资料稀缺,也很缺人才,体系还不够成熟。在小公司,你可能会身兼数职,比如配合开发工程师进行测试,也有可能承担部分运维方面的工作。以至于某招聘网站出现了开发运维测试实施工程师这种岗位。

本人之前从事 Java web 后端开发,后来转向了软件实施行业,深知这个行业很缺人。发展方向,可以朝着项目管理方向提升自我,比如利用空余时间考一个软考高项信息系统项目管理师、**项目管理专业人士认证(PMP)**。

个人目前有几个项目的现场实施经验,也与许多人打过交道。关于面试这方面,出题也差不多。如果是医疗行业,也许使用微软的那一套比较多。更注重的是临时应变能力和 SQL 的运用能力,以及对项目实施布控的周期预估和控制。

如果你有实际项目经验,基本上不会遇到笔试题。一般情况先与HR交谈,然后可能会与项目经理或者工程部主管进行沟通。下面给出一个面试复盘进行参考

面试复盘:软件实施工程师,顿悟试岗期美其名曰岗前培训

第一部分《软件实施面试实际方案篇》

一、软件实施面试专业技能试题

01 理论思考题

1、作为一名软件实施工程师,你的职责是什么?该岗位需要具备什么样的能力?

解答

  1. 推广公司的产品,现场为客户实施安装。
  2. 熟悉公司的产品,现场对客户进行培训。

2、你熟悉的远程方式有哪些?各种方法应该怎么配置?

解答

  1. Windows:常见的QQ远程桌面,或者用QQ办公版TIM。
  2. 或者采取有远程桌面功能的软件,或者其它OA办公系统。最终达到预期目标,采用远程协助达成客户需求。

win10还有自带的远程桌面

img

开启远程桌面协助

img

快捷键win + r打开任务输入mstsc命令打开远程桌面。

img

关于远程桌面补充一些个人工作中使用过的。

有桌面也有服务器版,个人主要在Windows平台使用:

  1. 向日葵
  2. ToDesk
  3. TeamViewer

目前个人更趋向于ToDesk,更轻更快,体验友好一些。

云端远程桌面,个人主要在Linux平台使用:

  1. UltraVNC
  2. VNC-Viewer(realVNC)

Linux发行版操作系统使用ssh远程连接

  1. Xshell(个人版免费使用);
  2. SecureCRT(收费);
  3. Putty(免费);
  4. tabby(开源的多终端集合);
  5. FinalShell:这款优势带有监控cpu和内存使用情况图形化界面。

方式方法有很多,只要能实现ssh连接的终端工具。

文件传输工具:WinSCP-5.11.2-Setup。

img

3、在你进行实施的过程中,公司制作的一款软件系统缺少某一项功能,而且公司也明确表示不会再为系统做任何的修改或添加任何的功能,而客户也坚决要求需要这一项功能!对于实施人员来说,应该怎么去合理妥善处理这个问题?

解答

  1. 首先看用户要求合不合理,不合理就坚决退还需求,如果需求合理,可以申请二次开发,需要考虑公司的利益。
  2. 然后综合考虑客户的重量级,对客户强调合同成本,外加某一项功能需要耗费的人力物力是需要付出额外的成本的。
  3. 最后考虑第三方软件补助。

4、如销售签有一外地客户,要求实施人员在客户现场一周内完成所有项目实施,而标准实施一般为期一个月,针对以上情况实施人员应该如何应对?

解答

  1. 标准实施为一个月,那就按签订的合同行事。
  2. 然后考虑这个项目一周完成,在当前的人力和时间成本下是否可行。
  3. 如果想加快进度可以与公司沟通,额外派人,与客户客户协商额外的劳动成本。

5、在项目实施过程中,使用者对产品提出了适合自己习惯的修改意见,但多个使用者相互矛盾,应该如何去处理?

解答

采用求同存异法。

  1. 对于客户的意见,我们实施人员应该有自己的实施方案。
  2. 当使用者意见出现不一致时候,引导客户内部意见达到统一和用户经过沟通确认后,找到切实可行的方案,双方认可并达成共识。

6、系统启动后,不能连接数据库,可能是哪些方面的原因?

解答

  1. 检查网络原因;
  2. 检查数据库服务是否启动;
  3. 数据库文件是否被破坏;
  4. 数据库端口号问题(防火墙是否放通)

7、如果有一个不太懂电脑的客户,你应该采取什么样的方法去教他用公司的软件产品?

解答:首先教客户熟悉基本的电脑操作,然后参考相关文档操作,实际根据软件的复杂程度去教会客户熟悉使用公司产品。遵循由易到难,简单的可以直接教会客户熟悉运用。复杂的一步一步是jio印。

也可以做其它的补足

  1. 制作ppt;
  2. 图文操作文档;
  3. 录制视频。

8、针对于已有5年以上的客户,其产生的历史数据可以怎么处理?

解答

  1. 综合考虑客户的重量级;
  2. 重量级客户,提前计划,做好用户数据的备份。一切从公司的利益考虑。

9、一般数据库若出现日志满了,会出现什么情况,是否还能使用?

解答

  1. 只能执行查询等读取操作。不能执行修改,备份等写操作,原因是任何写操作都要记录日志。
  2. 数据库本就是需要承载读写操作的,也就是说基本上处于不能使用的状态。

02 SQL实际操作题

10、已知A、B两表A.id=B.AID请分别写出内外链接的sql语句,并说明区别?

解答

  1. 内连接关键字 inner join on;内连接取A和B的交集公共部分。
  2. 外连接关键字:left join onright join on。外连接分左外连接和右外连接,左外连接以左表为主,右外连接以右表为主。
  3. 参考下图,以数学集合的思想来思考更加清晰明了。

注意:外连接是可以省略 outer 关键字的,例如:左外连接 left outer join 简写为 left join,右外连接同理,后面配合 on 关键字。

二、SQL中的联合查询图解

1、内连接

内连接:

1
inner join on

img

2、左外连接

左外连接:省略掉了 outer,下同。

1
left join on

img

3、右外连接

右外连接:

1
right join on

img

关联查询有 6 种,常用的两种,内连接和外连接。个人实际工作中内连接使用更多,具体视工作情况而定。这里不做详细说明,网上教程很多,可以自行参考。

4、可参考资料

菜鸟教程直通车:https://www.runoob.com/mysql/mysql-join.html

面试了几家招软件实施的,基本上前几道笔试题是考量你的现场应变能力,后几道笔试题是考量你对SQL的运用,关联查询这方面的试题居多。软件实施一般是需要去固定的场所驻场的,需要有自己的一套方案,做到心中有数,在现场不至于慌慌张张。也需要结合现场的实际情况,灵活变通运用。这个行业是需要靠时间累积行业经验,不是一蹴而就。

————————–更新后的补充————————–

第二部分《面试进阶,实际工作篇》

之前一些实际SQL操作,我直接引用了别人一些教程链接,发现在打广告就删掉了。引用菜鸟教程依旧保留,毕竟这货干净简洁。

思来想去,还是自己重新补充一些,毕竟Oracle方面的教程都比较久远了。以后可能不会像这样将具体内容更新进来了,会以链接形式发自己的面经和时间工作经验总结。当然,此次更新的内容也将以单篇发布出来。

官方提供的sakila和world数据库,官网下载地址已经提供,可以下载进行参考学习。

sakila-db数据库包含三个文件

  • sakila-schema.sql:数据库表结构
  • sakila-data.sql:数据库示例模拟数据
  • sakila.mwb:数据库物理模型,在MySQL workbench中可以打开查看。

https://downloads.mysql.com/docs/sakila-db.zip

world-db数据库,表结构与data数据包含在一起:

https://downloads.mysql.com/docs/world-db.zip

Oracle11g安装后自带有scott用户,可以用来练习。主要用到的是EMP和DEPT表,想起了当年用Java的ssh框架写的第一个CURD的demo示例就是Oracle的这两张表,因为这两表有关联关系。

  • EMP:员工表;
  • DEPT:部门表;

我的测试环境基于

  • 操作系统:Windows10;
  • 数据库:MySQL8.0.28和Oracle11g;
  • 使用查询工具:MySQL8.0自带命令行以及Oracle自带的SQLplus;
  • 第三方工具SQLyog和PLSQL Developer。

三、联合查询

图解联合查询

内连接:统计的内容是table1和table2的重合部分。

1
inner join on

img

左外连接:可以省略掉outer,统计的内容是以table1为主的部分。

1
left outer join on

img

右外连接:同样可以省略掉outer,统计的内容是以table2为主的部分。

1
right outer join on

img

1、联合查询

1.1、MySQL中的联合查询示例

  • inner join on:内连接
  • right join on:右外连接
  • left join on:左外连接

MySQL中的内连接查询关键字:inner join on,只作为演示,就不执行explain执行计划去判断执行效率了。小小的建议,在测试这些个联合查询的时候,可以不用带太多的过滤条件看看三种联合查询的区别。

1
2
3
SELECT c.`ID`,c.`CountryCode`,cl.`CountryCode`,cl.`Language` 
FROM world.`city` c INNER JOIN world.`countrylanguage` cl
ON c.`CountryCode`=cl.`CountryCode` WHERE c.`ID`>120 AND c.`ID` LIMIT 0,5;

img

MySQL中的左外连接查询查询关键字:LEFT OUTER JOIN

1
2
3
SELECT c.`ID`,c.`Name`,c.`CountryCode`,cl.`IsOfficial`,cl.`CountryCode`,cl.`Language` 
FROM world.`city` c LEFT OUTER JOIN world.`countrylanguage` cl
ON c.`CountryCode`=cl.`CountryCode` LIMIT 0,5;

img

MySQL中的右外连接查询关键字:RIGHT OUTER JOIN

1
2
3
SELECT c.`ID`,c.`Name`,c.`CountryCode`,cl.`IsOfficial`,cl.`CountryCode`,cl.`Language` 
FROM world.`city` c RIGHT OUTER JOIN world.`countrylanguage` cl
ON c.`CountryCode`=cl.`CountryCode` LIMIT 0,5;

img

1.2、Oracle中的联合查询示例

主要以SCOTT用户作为示例,查看SCOTT用户下有哪些表,这种方式需要以dba管理员身份运行SQL语句查询:

ower代表了用户名,所以直接查找SCOTT用户,TABLE_NAME:代表了表名。

1
select t.OWNER,t.TABLE_NAME,t.TABLESPACE_NAME from dba_tables t where t.OWNER='SCOTT';

img

Oracle中的联合查询,同样以员工表(emp)和部门表(dept)进行演示操作。

Oracle中的内连接:inner join on

根据部门编号进行关联查询,进行分页查询,每页显示5条数据:

1
2
select e.ename,e.empno,d.deptno,d.dname from scott.emp e 
inner join scott.dept d on e.deptno=d.deptno where rownum<=5;

img

左外连接:left outer join on

1
2
select e.ename,e.empno,d.deptno,d.dname from scott.emp e 
left outer join scott.dept d on e.deptno=d.deptno where rownum<=5;

img

右外连接:right outer join on

1
2
select e.ename,e.empno,d.deptno,d.dname from scott.emp e 
right outer join scott.dept d on e.deptno=d.deptno where rownum<=5;

img

全连接:full join on

1
2
select e.ename,e.empno,d.deptno,d.dname from scott.emp e 
full join scott.dept d on e.deptno=d.deptno where rownum<=5;

img

组合查询:union

1
2
select e.ename,e.empno from scott.emp e where rownum<=5 union select e.ename,e.empno from scott.emp e  
where e.ename like '%ARC%';

img

组合查询:union all

1
2
select e.ename,e.empno from scott.emp e where rownum<=5 union all select e.ename,e.empno from scott.emp e  
where e.ename like '%ARC%';

img

union和union all是有区别的,我列举的例子进行了模糊匹配,没演示出来效果。使用union all后DBMS不会取消重复的行。

去掉后面的like条件,使用union统计的数据为14行,使用union all统计的数据为19行,其实不难理解,all就是全部。

2、分页查询

2.1、MySQL的分页查询使用limit关键字

tips:Windows中CMD命令窗口使用color a即可调用出黑色背景绿色字体,color f0则是快速调出白色背景黑色字体哟!

护眼色:R:181 G:230 B:181

示例:使用world数据库中city表进行演示分页查询,通过desc展示数据结构,尤其是配合开发进行联调的时候很常用:

1
mysql> desc world.city;

img

查询world数据库中的city表前5条数据

1
mysql> select * from city limit 0,5;

img

2.2、Oracle的分页查询使用rownum伪列

同样使用desc关键字查询emp表结构:

1
SQL> desc scott.emp;

img

分页查询示例:使用rownum关键字进行演示Oracle中的分页查询。

查询scott用户中emp(员工表)的员工empno:编号、ename:员工姓名以及伪列rowid,只查询前5条数据:

1
SQL> select t.rowid,t.empno,t.ename from scott.emp t where rownum <=5;

img

Oracle进行分页查询常用方式一,查询第6~11数据通过嵌套子查询,使用到关键字rownum和where:

1
2
3
4
-- 统计emp数据总条目数
select count(*) from scott.emp;
-- 查询第6~11数据通过嵌套子查询,使用到关键字rownum和where
select * from (select scott.emp.empno,rownum r from scott.emp Where rownum<=11)where r>=6;

Oracle进行分页查询常用方式二,先进行order by排序,再分页查询,查询第6~11数据:

1
2
3
4
-- 先进行排序
select * from emp e order by e.empno Desc;
-- 再进行分页
select * from (select e.*,rownum r_num from(select * from scott.emp e order by e.empno desc )e)b where b.r_num between 6 and 11;

四、聚合函数(Aggregate)

下面所讲的函数大多数标准SQL数据库是支持的,但也要依据实际情况做测试验证,个人主要验证的是MySQL和Oracle。

重点:count、sum函数在我们如果要迁移数据的时候,避免不了需要手动去统计求和对比迁移前后数据的一致性。

1、常见的聚合函数

介绍几个聚合函数

  • count函数用于统计条目数;
  • sum函数用于求和;
  • substr函数用于截取;
  • avg函数用于取平均值;
  • max函数用于取最大值;
  • min函数用于取最小值。

如下则演示同时使用多个函数,查询Oracle数据库scott用户的emp表:

查询出来的结果:count统计员工总数,sum求和所有员工的薪水总额,avg统计所有员工平均薪水,substr则是截取到小数点后两位数。

1
2
-- count:统计条目数,sum:求和,substr:截取,avg:取平均值
select count(*), sum(t.sal), substr(avg(t.sal), 0, 7) from scott.emp t;

img

返回平均值avg,一般配合substr关键字去截取,通过计算保留小数点后两位。

统计某公司员工的平均薪资:

1
2
3
-- avg:取平均值
select avg(t.sal) from scott.emp t;
select substr(avg(t.sal), 0, 7) from scott.emp t;

img

返回统计行数count

统计某公司员工总数:

1
2
-- 统计函数count:统计emp表条目数量14
select count(*) from scott.emp;

img

返回总数(求和)sum,sum函数一般会配合decode函数使用。上面的黑色背景看久了眼睛累,特意换了一种护眼色。字体颜色就没有特意更换,字体稍微点大了一丢丢,看的更舒服。

统计某公司所有员工薪资总和:

1
2
3
4
5
6
7
8
9
-- 求和函数sum的使用
select sum(t.sal) from scott.emp t;
-- 配合decode函数使用
select sum(decode(ename, 'SMITH', sal, 0)) SMITH,sum(decode(ename, 'ALLEN', sal, 0)) ALLEN,
sum(decode(ename, 'WARD', sal, 0)) WARD,sum(decode(ename, 'JONES', sal, 0)) JONES,
sum(decode(ename, 'MARTIN', sal, 0)) MARTIN,sum(decode(ename, 'BLAKE', sal, 0)) BLAKE,
sum(decode(ename, 'CLARK', sal, 0)) CLARK,sum(decode(ename, 'SCOTT', sal, 0)) SCOTT,
sum(decode(ename, 'KING', sal, 0)) KING,sum(decode(ename, 'TURNER', sal, 0)) TURNER
from scott.emp;

img

tips:count函数在工作中使用的很频繁,你不清楚某张表中有多少条记录,需要统计一下再处理。

返回最大值max

查看员工中薪水最高的那一位:

1
2
-- max函数的使用
select max(t.sal) from scott.emp t;

img

返回最小值min

查看员工中薪水最低的那一位:

1
select min(t.sal) from scott.emp t;

img

Oracle中的rownum伪列

统计公司员工中的最后一条记录,通过rownum实现:

1
2
select t.sal from scott.emp t where rownum <=1;
select t.sal from scott.emp t where rownum <=1 order by t.sal desc;

img

MySQL中的分页limit关键字

通过limit关键字实现,根据sakila数据库中的actor(演员表)为例子返回最后三条记录,使用actor_id进行排序。

注意limit属于MySQL扩展SQL92后的语法,在其它数据库中不能通用。Oracle的分页可以通过rownum来实现,上面也介绍了。

1
SELECT t.`first_name`,t.`actor_id` FROM sakila.`actor` t ORDER BY t.`actor_id` DESC LIMIT 0,3;

img

2、着重掌握的函数

  • group by 函数用于分组;
  • having 函数用于过滤,对分组后内容进行过滤。

group by函数

配合聚合函数sum使用,查询Oracle中scott用户下的emp表。使用group by进行分组,然后统计公司各部门员工的薪资

1
SELECT t.deptno, SUM(t.sal) AS sals FROM scott.emp t GROUP BY t.deptno;

img

having函数

区别havingwhere 的区别在于,having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤。如果逻辑允许,应尽可能用 where 先过滤记录,由于结果集的减小,对聚合的效率明显提升。最后再依据逻辑判断是否用 having 再次过滤。

配合聚合函数使用,Oracle中 的 scott 用户下 emp 与 dept 表。

先对部门名称进行分组,然后使用having过滤出薪水总和大于10000的部门:

1
2
3
SELECT d.dname, SUM(e.sal) AS sals FROM scott.emp e
INNER JOIN scott.dept d ON e.deptno=d.deptno
WHERE e.deptno < 30 GROUP BY d.dname HAVING SUM(e.sal) > 10000;

img

五、SQL核心知识

凡事应以实际工作场景而定。个人的以一些理解仅仅是建议,最终的应用还需结合实际应用场景。软件实施对SQL的函数、触发器和存储过程没有太高的要求,但也需要会基本的运用。在某些特殊的场景下,使用这些SQL的核心知识将有助于提高我们的工作效率。

1、函数

函数关键字:FUNCTION

使用第三方客户端工具新建函数,会自动生成一些模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$  -- 声明关键字DELIMITER
CREATE -- 创建函数的关键字create
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `study`.`stu_num`() -- 设置函数名称
RETURNS TYPE -- 返回值的类型
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN -- 开始业务逻辑
-- {业务逻辑区...}
END$$ -- 结束标志
DELIMITER ;

2、触发器

触发器关键字:TRIGGER

使用第三方客户端工具新建触发器,会自动生成一些模板:

1
2
3
4
5
6
7
8
9
DELIMITER $$
CREATE -- 创建触发器的关键字create
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `study`.`stu_insert` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `study`.`<Table Name>`
FOR EACH ROW BEGIN -- 使用到for each循环
-- {业务逻辑区...}
END$$
DELIMITER ;

3、存储过程

存储过程关键字:PROCEDURE

支持完整事务的存储引擎,在保证数据的完整一致性情况下,尽可能多的使用commit事务提交。利用函数和存储过程一个好的示例,在MySQL中快速生成千万级别的数据大表进行测试就可以应用到,同时还能联想到测试性能。这是勾起我们学习的动力,一个比较好的方法。

使用第三方客户端工具新建存储过程,会自动生成一些模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `study`.`insert_study`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
-- {业务逻辑区...}
COMMIT; -- 支持完整事务的存储引擎,在保证数据的完整一致性情况下,尽可能多的使用commit事务提交
END$$
DELIMITER ;

4、典型的示例sakila数据库

这是一个MySQL官方提供的拥有存储过程、触发器和函数示例的电影出租信息管理系统数据库。并且官方提供了EER模型,便于理解每张表之间的关联关系,可以使用MySQL workbench打开sakila.mwb进行参考学习。如果你能完整的看完这篇文档,你会发现在一开始我就提供了sakila数据库的官网下载地址。

sakila数据库视图:actor_info,演员信息视图

使用DESC关键字进行查看视图结构,这个关键字很实用哟。视图和表结构很像,以sakila中actor_info视图进行展示:

img

sakila数据库存储过程:film_in_stock,电影库存

官方的一个示例:创建一个存储过程,声明了三个常量字段,然后分别赋值给演示字段,最后将找到的记录复制存到了p_film_count中。这里我为何说是复制呢?是因为使用到了SELECT … INTO关键字。

函数、触发器和存储过程最主要的一块在BEGIN {业务逻辑区…} END这一块区域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $$
USE `sakila`$$
DROP PROCEDURE IF EXISTS `film_in_stock`$$
CREATE DEFINER=`root`@`%` PROCEDURE `film_in_stock`(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
SELECT inventory_id
FROM inventory
WHERE film_id = p_film_id
AND store_id = p_store_id
AND inventory_in_stock(inventory_id);
SELECT FOUND_ROWS() INTO p_film_count;
END$$
DELIMITER ;

关于函数我就不列举MySQL官方提供的示例了。

给出一点小小的建议,感觉对你没啥作用可以忽略掉:首先快速熟悉语法使用,对官方的示例进行解读,然后运行验证。最后,书写一些简单的示例达到熟练运用目的。不要只停留在想要执行,而是立即执行并带着思考去看待问题。多问一个为什么,思考本质。

——————更新于2022-3-14——————

六、SQL查漏补缺

  1. SQL模糊匹配(like)
  2. SQL通配符
  3. SQL高级过滤
  4. show操作符(主要介绍MySQL中的用法)

更新文章:最近回顾以前工作,发现这些操作符也挺常用的。

SQL模糊匹配——通配符——高级过滤

END 莫问收获,但问耕耘

终身学习,源于某一次面试的总结,结果停不下来了。以上也是对 SQL 常用联合查询以及聚合函数的一个总结,希望能对你的工作与学习有所帮助。善于总结,其乐不穷。好记性不如烂笔头,多收集自己第一次尝试的成果,收获也颇丰。你会发现,自己的知识宝库越来越丰富

静下心来,才发现原来不会的还有很多。

一分耕耘,一分收获。

多总结,你会发现,自己的知识宝库越来越丰富。

以上总结,仅供参考!

最后,希望这篇总结对你的学习和工作有些许帮助!

—END—