关于经验:我在京东做研发-京东云算法科学家解析爆火的ChatGPT

令人惊艳的ChatGPT横空出世 背地有怎么的前沿技术撑持 走向大规模产品利用又有何局限 深耕对话式AI技术十余年 京东云算法科学家将带您一起走进技术世界 解析ChatGPT的技术亮点与局限 分享下一代对话式AI技术趋势 从好玩到好用 探讨对话式AI的落地实际 嘉宾介绍 吴友政, 京东团体高级总监,京东科技语音语言算法部负责人。2006年中科院自博士毕业后,先后在日本国立信息通信钻研机构、英国爱丁堡大学、索尼中国研究院从事自然语言解决相干钻研工作。工作次要聚焦自然语言解决、人机对话、语音辨认、机器翻译等前沿技术钻研和产品研发工作,并获得了诸多技术冲破,累计发表顶级国内会议和期刊论文30余篇,曾取得语音辨认(IWSLT2012、IWSLT2013)和自然语言解决(QuAC2021,DROP2022,Multiwoz2022)畛域多项国内较量的冠军。他与团队密切合作打造了言犀人工智能利用平台,为客户提供涵盖客户服务、营销导购、流程自动化的整体智能化解决方案,为京东超5.8亿用户提供智能服务,也为批发、政务、金融、交通等行业提供产品与解决方案。他也曾获京东团体最高奖-技术金牛奖等。

January 6, 2023 · 1 min · jiezi

关于经验:用kmer分析进行基因组调查四用GenomeScope评估基因组特征

(全文约3500字) 【举荐】用Smudgeplot评估物种倍性后,用组合jellyfish+GenomeScope1.0做二倍体物种的基因组考察,用组合KMC+GenomeScope2.0做多倍体物种的基因组考察。 1. k-mer进行基因组考察的软件详情k-mer进行基因组考察分为k-mer频数统计和基因组特色评估两步。 GenomeScope能够实现第二步基因组特色评估。须要在jellyfish/KMC等软件的第一步后果k-mer频数散布表的根底上,GenomeScope才可实现。举荐第一步获取k-mer频数散布表的命令: jellyfish jellyfish count -C -m 21 -s 1000000000 -t 10 *.fastq -o sample.jf #计算k-mer频率,生成sample.jfjellyfish histo -t 10 sample.jf > sample.histo #生成k-mer频数直方表sample.histo和k-mer直方图KMC mkdir tmpls *.fastq.gz > FILESkmc -k21 -t16 -m64 -ci1 -cs10000 @FILES kmcdb tmp #计算k-mer频率kmc_tools transform kmcdb histogram sample.histo -cx10000 #生成k-mer直方图2. GenomeScope详情GenomeScope能够利用第一步jellyfish或KMC等其他软件剖析失去k-mer频数散布表(sample.histo文件)实现第二步基因组特色评估。GenomeScope1.0在2017年发表,用于二倍体物种的基因组考察;2020年又发表了GenomeScope 2.0版本,用于多倍体物种的基因组考察,并公布了用于判断物种倍性的Smudgeplot。GenomeScope1.0的基因组特色后果包含基因组大小(genome size),杂合度(heterozygosity),反复序列比例,GC含量等;GenomeScope2.0的基因组特色后果包含基因组大小(genome size),杂合度(heterozygosity),反复序列比例,GC含量,基因型比例,和基因组构造(同源/异源多倍体)等。GenomeScope有网页版和Linux本地版,性能一样;举荐网页版,免去装置的麻烦。3. GenomeScope1.0 网页版【举荐】—— 实用于二倍体物种GenomeScope1.0 网页版:http://qb.cshl.edu/genomescope 上传第一步取得的k-mer频数散布表sample.histo文件;设置参数Kmer length为第一步抉择的k-mer长度值,这里是17;参数Read length为序列读长,个别为150;参数Max kmer coverage默认是1000。 倡议依照物种状况批改,比方10000,以统计更精确。 这个参数太小,可能造成过滤过多的Kmer,导致预计的基因组大小偏小的状况。 这个参数太大则可能把高拷贝数量的DNA,比方叶绿体DNA,包含进Kmer的统计,造成GenomeScope算法的误差,所以还是不举荐应用-1或太大的值。 提交后几分钟就能够失去后果,保留后果图片可用于发表。<img src="https://github.com/yanzhongsino/yanzhongsino.github.io/blob/hexo/source/images/omics_genome.survey_GenomeScope1.0.png?raw=true" width=80% title="GenomeScope1.0后果示例" align=center/> <p align="center">Figure 1. GenomeScope1.0后果示例</p> 4. GenomeScope2.0 网页版 【举荐】 —— 实用于多倍体物种GenomeScope2.0 网页版:http://qb.cshl.edu/genomescop... ...

June 16, 2022 · 2 min · jiezi

关于经验:用kmer分析进行基因组调查三用KMC进行kmer频数统计

(全文约1300字) 【举荐】用Smudgeplot评估物种倍性后,用组合jellyfish+GenomeScope1.0做二倍体物种的基因组考察,用组合KMC+GenomeScope2.0做多倍体物种的基因组考察。 1. k-mer进行基因组考察的软件详情k-mer进行基因组考察分为k-mer频数统计和基因组特色评估两步。 KMC能够实现第一步k-mer频数统计。KMC的后果sample.histo能够用在GenomeScope上,实现第二步基因组特色评估。2. KMC 简介KMC是一个用来从FASTQ/FASTA文件中计算k-mers的基于KMC二进制数据库的程序。KMC是波兰的Silesian University of Technology的算法和软件学院的REFRESH Bioinformatics Group开发的工具。2017年公布了第三个版本,KMC3。KMC是次要基于C语言的程序。3. KMC 装置版本 有两个版本的KMC,个别应用第一个版本,Smudgeplot评估物种倍性时用到了第二个版本。 一个是REFRESH Bioinformatics Group的refresh-bio/KMC。一个是GenomeScope2.0的开发团队tbenavi1批改的tbenavi1/KMC下载 在KMC download找对应零碎的最新版本KMC软件,下载解压缩即可应用。 mkdir KMC && cd KMCwget https://github.com/refresh-bio/KMC/releases/download/v3.2.1/KMC3.2.1.linux.tar.gz #下载最新版本的KMCtar -xzf KMC3.2.1.linux.tar.gz #解压缩和解包,生成bin文件夹和include文件夹应用 解压缩后bin目录下会蕴含可执行文件,可间接应用,倡议退出环境变量,包含: bin/kmc:计算k-mer频数的主程序bin/kmc_dump:在kmc生成数据库中列出k-mers的程序bin/kmc_tools:容许操作kmc数据库的程序4. KMC 运行用KMC计算k-mer频率,生成k-mer频数直方表和k-mer直方图。 运行 mkdir tmp #创立长期文件夹ls *.fastq.gz > FILES #用于剖析的clean reads门路保留到文件FILES中kmc -k21 -t16 -m64 -ci1 -cs10000 @FILES kmcdb tmp #计算k-mer频率kmc_tools transform kmcdb histogram sample.histo -cx10000 #生成k-mer频数直方表sample.histo和k-mer直方图kmc命令参数-k21:k-mer长度设置为21-t16:线程16-m64:内存64G,设置应用RAM的大抵数量,范畴1-1024。-ci1 -cs10000:统计k-mer coverages覆盖度范畴在[1-10000]的。@FILES:保留了输出文件列表的文件名为FILESkmcdb:KMC数据库的输入文件名前缀tmp:长期目录kmc_tools命令参数-cx10000:贮存在直方图文件中counter的最大值。后果 生成的sample.histo可用于第二步GenomeScope的剖析。 5. 基因组特色评估取得k-mer频数散布表sample.histo后 举荐用GenomeScope1.0或者GenomeScope2.0或者GenomeScope的R脚本来做基因组特色评估和画图。也可间接用R绘制sample.histo的频率散布直方图/频率散布曲线。5.1. GenomeScope 网页版5.1.1. GenomeScope1.0 网页版 —— 实用于二倍体物种在GenomeScope1.0 网页版上传前一步取得的k-mer频数散布表sample.histo文件。设置参数k-mer length为第一步抉择的k-mer长度值,这里是17;参数Read length为序列读长,个别为150;最初一个参数Max kmer coverage倡议批改成更大的10000,以统计更多的k-mers。结果显示预估的基因组大小,杂合度,反复率等信息。5.1.2. GenomeScope2.0 网页版 —— 实用于多倍体物种GenomeScope2.0 网页版也是相似的步骤。 ...

June 16, 2022 · 1 min · jiezi

关于经验:用kmer分析进行基因组调查二用jellyfish进行kmer频数统计

(全文约1520字) 【举荐】用Smudgeplot评估物种倍性后,用组合jellyfish+GenomeScope1.0做二倍体物种的基因组考察,用组合KMC+GenomeScope2.0做多倍体物种的基因组考察。 1. k-mer进行基因组考察的软件k-mer进行基因组考察分为k-mer频数统计和基因组特色评估两步。 jellyfish能够实现第一步k-mer频数统计。jellyfish的后果sample.histo能够用在GenomeScope上,实现第二步基因组特色评估。2. jellyfish 简介jellyfish是Center for Bioinformatics and Computational Biology在2011年研发的一款对DNA的k-mers计数的软件,用Hash表贮存数据,能多线程运行。 3. jellyfish 装置conda装置conda install -c bioconda jellyfish #装置的是v2.2.10github装置在github:jellyfish上通过源码装置。4. jellyfish 运行个别先用jellyfish count进行k-mer计数,而后用jellyfish histo对后果进行统计,取得k-mer的频数散布直方表sample.histo。 4.1. count —— k-mer计数命令jellyfish count -m 17 -s 10G -t 12 -C -o sample.jf <(zcat sample_1.fq.gz) <(zcat sample_2.fq.gz) 参数sample_1.clean.fq sample_2.clean.fq 应用的PE reads,不反对压缩格局*.fq.gz输出文件,如果不解压缩,也能够用<(zcat sample_1.fq.gz) <(zcat sample_2.fq.gz)代替sample_1.fq sample_2.fq; 或者应用这种模式zcat *fq.gz | jellyfish count /dev/fd/0,其中/dev/fd/0是过程输出标记,代表管道前后果传递。 -m 17 k-mer长度设置为17bp。如果基因组大小为G(单位是bp),k-mer长度举荐设置成log(200*G)/log(4)。500Mbp的基因组对应约为17,1Gbp的19,10Gbp的21。 -s 1000M 存储用的hash表大小为1000M,这个参数辨认单位M(Mbp)和G(Gbp)。若该值不够大,则会生成多个hash文件,以数字辨别文件名。最好设置的值大于总的独特的(distinct)k-mer数,这样生成的文件只有一个。如果基因组大小为G,每个reads有一个谬误,总共有n条reads,则该值能够设置为[(G + n)/0.8]。 -t 12 线程12 -C 对DNA正负链都进行统计,示意思考DNA正义与反义链,遇到反义kmer时,计入正义kmer频数中。如果是双端测序reads,须要这个参数。 ...

June 16, 2022 · 1 min · jiezi

关于经验:2021助理高薪拉钩产品经理高薪训练营

download:2021助理高薪-拉钩产品经理高薪训练营使用反射和动静代理实现一个View注解绑定库 反对的功能@ContentView 绑定layout 代替setContentView()@BindView 绑定View 代替findViewById()@OnClick 绑定点击事件 代替setOnClickListener()@OnLongClick 绑定长按事件 代替setOnLongClickListener() 代码注解类@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ContentView { int value();}复制代码@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface BindView { int value();}复制代码@Target(ElementType.ANNOTATION_TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface OnEvent { //订阅形式String setCommonListener();//事件源对象Class<?> commonListener();}复制代码@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@OnEvent(setCommonListener = "setOnClickListener", commonListener = View.OnClickListener.class)public @interface OnClick { int value();}复制代码@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@OnEvent(setCommonListener = "setOnLongClickListener", commonListener = View.OnLongClickListener.class)public @interface OnLongClick { int value();}复制代码实现类public class MsInjector { public static void inject(Object object) { injectContentView(object); injectView(object); injectEvent(object);}private static void injectContentView(Object object) { Class<?> clazz = object.getClass(); //获取到ContentView注解 ContentView contentView = clazz.getAnnotation(ContentView.class); if (contentView == null) { return; } //获取到注解的值,也就是layoutResID int layoutResID = contentView.value(); try { //反射出setContentView方法并调用 Method method = clazz.getMethod("setContentView", int.class); method.invoke(object, layoutResID); } catch (Exception e) { e.printStackTrace(); }}private static void injectView(Object object) { Class<?> clazz = object.getClass(); //获取到所有字段并遍历 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); //获取字段上的BindView注解 BindView bindView = field.getAnnotation(BindView.class); if (bindView == null) { continue; } //获取到viewId int viewId = bindView.value(); try { //通过反射调用findViewById失去view实例对象 Method method = clazz.getMethod("findViewById", int.class); Object view = method.invoke(object, viewId); //赋值给注解标注的对应字段 field.set(object, view); } catch (Exception e) { e.printStackTrace(); } }}private static void injectEvent(Object object) { Class<?> clazz = object.getClass(); //获取到当前页年一切办法并遍历 Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { declaredMethod.setAccessible(true); //获取方法上的所有注解并遍历 Annotation[] annotations = declaredMethod.getDeclaredAnnotations(); for (Annotation annotation : annotations) { //获取注解本身 Class<? extends Annotation> annotationType = annotation.annotationType(); //获取注解上的OnEvent注解 OnEvent onEvent = annotationType.getAnnotation(OnEvent.class); if (onEvent == null) { continue; } //拿到注解中的元素 String setCommonListener = onEvent.setCommonListener(); Class<?> commonListener = onEvent.commonListener(); try { //因为上边没有明确获取是哪个注解,所以这里需要使用反射获取viewId Method valueMethod = annotationType.getDeclaredMethod("value"); valueMethod.setAccessible(true); int viewId = (int) valueMethod.invoke(annotation); //通过反射findViewById获取到对应的view Method findViewByIdMethod = clazz.getMethod("findViewById", int.class); Object view = findViewByIdMethod.invoke(object, viewId); //通过反射获取到view中对应的setCommonListener方法 Method viewMethod = view.getClass().getMethod(setCommonListener, commonListener); //使用动静代理监听回调 Object proxy = Proxy.newProxyInstance( clazz.getClassLoader(), new Class[]{commonListener}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //最终执行被标注的方法 return declaredMethod.invoke(object, null); } } ); //调用view的setCommonListener方法 viewMethod.invoke(view, proxy); } catch (Exception e) { e.printStackTrace(); } } }}}复制代码使用@ContentView(R.layout.activity_main)public class MainActivity extends AppCompatActivity { ...

May 11, 2022 · 2 min · jiezi

关于经验:干货自己开发了一个starter如何轻松嵌入到使用不同版本的springboot框架的对接方

背景最近应公司需要,开发了一个公司外部共用的二方库包。这里科普下:什么叫一方库,二方库,三方库。在阿里巴巴出品的 泰山版《Java开发手册》 附 2:专有名词解释章节中有提到一方库:本工程外部子项目模块依赖的库(jar 包)依赖本工程外部的common模块,外面通常会定义一些所有模块都会用到的一些根底性能,比方全局异样码、分布式锁、对立响应实体等等二方库:公司外部公布到地方仓库,可供公司外部其它利用依赖的库(jar 包)在互联网公司通常都是分事业部的,而后会存在一个叫根底部门/根底核心的事业部,这个部门可能会提供一些公司的根本类库,eg:mq相干的对立的amqp操作、rpc相干的对立的dubbo操作等等。最终这些都会以jar包的模式推送到maven仓库(公司外部须要搭建专有的maven仓库)。当初是spring boot的时代,如果公司用的是springboot这一套体系的话,这些jar包通常是以starter的形式提供,再利用springboot的主动拆卸机制,其余事业部能够很不便的对接。三方库:公司之外的开源库(jar 包)常见的springboot、mybatis因为公司外部应用的是springboot相干的技术栈,因而,我开发的二方库包是以starter的形式提供的。整个对接流程只须要两步: 1、须要将二方库包推送至maven仓库 2、其余事业部只须要增加二方库包的maven坐标 这里会有一些小细节:二方库包是一个我的项目工程,也会依赖一些二方库、三方库的状况。通常,二方库外部依赖的jar包的scope都会设置为provider(默认零碎曾经提供,不将二方库包外部依赖的jar包与对接方的我的项目耦合),然而不乏会呈现对接方无增加过相干依赖的状况,因而须要增加合乎对接方零碎版本的依赖。接下来,将以一个springboot引入spring-kafka的案例来了解如何找到适合的spring-kafka版本。 一、为什么maven会找不到spring-kafka的版本?假如这么一个场景:我开发的二方库包应用到的技术栈是springboot,外部开发的其中一个性能须要依赖spring-kafka的三方库。家喻户晓,springboot为咱们提供了及其舒服的开发环境,当咱们引入springboot框架后,它外部曾经定义了合乎以后版本的所有三方库依赖。因而,假如咱们要引入spring-kafka模块,只须要在pom.xml文件中增加如下坐标即可: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --></parent><!-- 只须要增加如下坐标即可,不须要指定版本 --><dependencies> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency></dependencies>在上述引入spring-kafka 模块时,咱们没有指定version也能够应用。这是因为spring-boot-starter-parent外部的dependencyManagement中定义了spring-kafka的依赖,作为子模块,只须要引入即可,版本号会默认继承父工程中的定义。如果对接方应用的是springboot 1.4.1.RELEASE版本,这个时候,再应用同样的形式来引入spring-kafka的话,你会发现,maven找不到spring-kafka的版本: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent><!-- 只须要增加如下坐标即可,不须要指定版本 --><dependencies> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency></dependencies>其大抵的起因就是:在spring-boot-starter-parent中外部并没有依赖过spring-kafka,因而无奈继承父类定义的版本,最终maven会提醒找不到对应的版本。对接方始终以springboot 1.4.1.RELEASE版本失常开发,不可能为了集成你的二方库而降级springboot版本吧?因而,咱们须要为对接方找到适合的spring-kafka版本。 二、如何找到springboot 1.4.1.RELEASE外部的依赖其中最简略的一种办法就是在idea中找到对应的pom文件定义,这是一种形式。然而作为一个二方库提供者,后续可能会常常要解决因业务侧springboot版本不同而导致无奈引入spring-kafka的问题。难道咱们要本地每次批改maven中springboot的版本,通过maven下载后再应用idea查看吗?这显然有点麻烦。还有一种做法是找官网springboot 1.4.1.RELEASE的文档,但连maven依赖中都没有波及kafka,大概率是此版本没有集成kafka。另外一种做法就是:参考此链接https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/。在此链接中,是springboot的所有版本的依赖,当初咱们要看1.4.1.RELEASE版本的springboot外部依赖了哪些类库,咱们能够这么定位: 定位版本 查看依赖pom文件 长于搜寻(搜寻spring-kafka) 能够看到,在springboot 1.4.1.RELEASE版本中外部并没有依赖spring-kafka。此时该怎么办呢?将springboot版本升级,持续往后搜寻,最终你会发现,在1.5.0.RELEASE版本中外部开始依赖了spring-kafka。因而,咱们能够尝试,在maven中引入查找进去的版本1.1.2.RELEASE 对应的pom.xml文件为 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>1.1.2.RELEASE</version></dependency>在这种场景下,引入**1.1.2.RELEASE**版本能够解决问题,对接方的零碎也能失常工作。兴许这种形式在其余场景不实用,但这的确是一种形式,咱们能够通过https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/链接找到每个springboot版本外部依赖的三方库,这比咱们在idea中批改版本号再下载对应的版本不便的多。三、总结一种定位依赖版本的另外一种解决方案,如果你感觉我的文章有用的话,欢送点赞、珍藏和关注。I'm a slow walker, but I never walk backwards

June 11, 2021 · 1 min · jiezi

关于经验:如何在网上找到自己想要的东西

基本上每个网民天天都在做的事件可能就是搜寻了,作为程序员则用的更多。本文不深刻具体的细节,从几个大方向聊一聊怎么在网上找到本人想要的货色,因而这些准则不仅仅对搜寻技术材料有用,对一般性的货色如搜寻电影、软件等都能够参考。 应用英文材料除了某些特定的内容,大部分状况下互联网的英文材料都比中文要好,尤其是计算机类的材料,次要有以下几个起因: 中文搜索引擎做得不好,懂得都懂国内互联网厂商更重视挪动端,且相互之间流量隔离(即私域)大部分计算机技术(编程语言、框架、软件)是国外创造的,原始材料就基于英文,比中文N道贩子品质高其余起因还有很多,感兴趣能够看看知乎为何中文互联网绝对英文互联网的内容品质较低?。如果英文不太好的同学,能够借助一些翻译工具,浏览器翻译插件等,顺便能够晋升本人的英语水平。 用好搜索引擎大部人应用搜索引擎,就是把须要搜寻的内容复制粘贴到搜寻栏,而后点击搜寻。实际上应用搜索引擎也有很多小技巧,这个在网上曾经有很多人总结了,举荐看这一篇Google高效搜寻的20个技巧。我总结一下大抵有这几个方面: 搜寻关键词而非语句,尽量去掉有效的关键词能够使后果必须蕴含或者不蕴含哪个关键词,或者必须蕴含多个关键词能够搜寻特定格局的文件能够搜寻指定网站的内容关注和珍藏有些内容可能比拟冷门,即应用好了搜寻也很难找到。这里就须要本人平时多关注和珍藏了,说得高大上一点,就是构建本人的常识索引体系。原则上,就是依据本人的业余,把平时看见的各类有价值的内容整合到一起,不便后续查看。形式上,从简略的浏览器书签到相似印象笔记这种多平台同步的工具都能够。 这里举个例子,有时候我须要录制电脑屏幕的软件,但不论是在百度还是Google搜寻录屏或者Record Screen,进去的要么是各种付费录屏软件的广告,要么是十几种录屏软件的比照,对于一个只想轻量级应用一下录屏的人来说基本无从选择。直到有一天逛知乎,看到一篇冷门的文章,举荐了一款开源轻量又功能强大的软件完全免费且功能齐全的录屏工具——Captura,一下子就解决了问题。这阐明有时候很多优良的货色不肯定是热门和火爆的,深刻关注相干畛域的内容和做好珍藏也很重要。 踊跃原创最初的最初,如果你真的发现无论应用什么办法都无奈在互联网上找到你要的货色,那意味着你发现了互联网上的一篇空白区!那就尽本人的能力去填补这一片空白吧,无论是写文章发博客,还是公布一个开源程序,能够为起初人做奉献,同时对本人也是一种晋升。

February 23, 2021 · 1 min · jiezi

既然硕士毕业也去搞开发那还去读研值吗

“ 好多人读了研,结果还是去搞开发了,是不是血亏啊? 都读了硕士还是去做开发岗,那我还读个喵的研啊? 读研的意义究竟是为何?到底能学到啥? 我到底要不要上船? ... ” 这是经常在私信、X乎、或者论坛里看到小伙伴们所经常讨论的一个话题,而且探讨这个问题的小伙伴很多都是观望并准备上船的仔。 正好今天又周末了,准备聊一聊这个话题,顺便烹制了一些鸡汤,小伙伴们不要客气。 01、既然要比划,那就先拿自己开刀,先来聊聊我自己身边的一些真实情况吧。 就以我当年毕业时实验室同学的就业情况为例。 我自己导师手下毕业的小伙伴共5个,有两个去了某互联网厂做开发,有一个去了某通信厂的销服岗,另外一个也去了某通信厂,不过也是做开发,有且仅有一个小伙伴去了某算法研究院继续做图像相关的算法。 这样算下来,从事老本行图像相关算法研究的也只有一个,不严谨的计算也就是只有20%的比例。 很明显了,本菜羊也是沦落为搞开发的社会底层钓丝Coder之一。毕竟能力有限,算法做得没心得,只好找借口说自己对开发感兴趣,结果真的在靠开发养家糊口。 工作一段时间后,接触了一些人,应该说身边的硕士研究生做开发、做产品的还是居多一些,搞算法研究或者偏底层一点研究的人比例还是稍微少一些。 02、既然这样,那搞开发真的需要研究生学历吗? 有一说一,编程开发真的重点看技术能力。在技术能力具备的前提下,学历对于编程开发来说或许没有那么重要。 最起码适合咱大部分普通人的「开发类岗位」对学历的要求没有那么高,最起码在招聘要求中本科学历基本足够了;只有少部分算法岗、大数据岗或者基础研发类岗位等,才有对硕士及以上学历的要求。 所以在现如今本科生非常普遍的情况下,本科学历应该是就业的基础学历壁垒了,所以为什么说专科小伙伴们有机会能升本则尽量升本,也就是这个意思。 03、聊到这里有些人不禁心生唏嘘,尤其是已经上船了的小伙伴,那我假如以后也去搞开发了,那读这个研还有个喵的意义啊?我鮳,我这不是浪费生命吗? 不知道小伙伴们有没有看之前B站的 「Rebuild 2020 科技全明星对话」 的节目,我认真看了一下 「雷军对话何同学」 那一期: 我注意到雷军先生在谈到大学学习的意义时提及了一个大家可能都会思考或彷徨的一个问题: 仔细想想会发现,这个问题和我们标题所聊的话题也有着很大的共性。 首先不管是正在读研的,还是观望中准备读研的小伙伴们必须要明确的一件事情就是:读研阶段是没有人会教我们就业相关的技能的,导师也不会。如果抱着这个期待上船,大概率会失望。 读研阶段泡在实验室里做“科研仔”的小伙伴们不在少数。有时候想想,其实像我们工科类读研的也算挺幸运了,或多或少总能接触点就业技能或者项目氛围,但是很多学科的研究生大部分时间的工作,可能都是如下这样的类似流程: 尤其是过程中的失败几乎是常态,而失败后的重复过程就显得倍感压力和枯燥,提不起兴趣也是狠正常的。 这时候就会引发芸芸众生的我们,日常焦虑和思考一个人生问题,那就是: 做着自己并不一定感兴趣的东西真的有用吗?我付出的时间和精力会白费吗?我个人觉得这倒未必,就像上面雷军先生说到的一样,当我们走向工作岗位以后,读研学到的专业技能和科研知识并不一定能派得上用场,专业对口的概率很小,但是这个过程中所训练到的一些基本能力和基础素养却将直接影响整个职业生涯的发展高度,包括但不限于: 自主学习的能力检索知识、归纳总结的能力坚持、抗压、交付力和抵抗孤独的能力沟通、协作、表达以及写作能力所以只要用心了,白给是不可能白给的。 实际工作几年下来,接触过不少小伙伴,既有本科生,也有研究生。抛开特例不谈,个人感觉即使就开发岗这一块来说,硕士出来的小伙伴的系统学习能力、发现和分析问题的能力,以及归纳总结的能力一般都不错,这样在岗位中也就更容易脱颖而出了。 所以如果抱着这样的心态去面对我们日常可能焦虑的「有用论/无用论」问题,内心是不是就稳多了。 04、还记得以前念书时,校园里偶尔听到的一句很“社会”的学谣是:“金本科、银硕士、破铜烂铁是博士”。 老实讲这话听起来有点扎耳,尤其对于已经在围城中读研的小伙伴来说。但实不相瞒,每次听到这句话基本都是从博士师兄口里说出来的。当然,我也知道博士大佬们苦中作乐,表面上一句不羁的玩笑谦虚自嘲,实则共励共勉。 的确,即使读了研也不要太高看自己,更不要有太重的心理包袱。 咱们大多数都是普通人,没必要在「别人的眼光」或者「其实可能不适合自己的标准」里徐图前行。客观地衡量自己的优劣势和兴趣点,并结合当下可能的机会,选一个适合自己的务实方向可能更有利于个人的长期发展,至少我个人是这么觉得的。 所以回到本文一开始所探讨的话题,谁说研究生毕业就不能做开发了,非得张口闭口:人工智能;机器学习;人在月球,刚下时光机;年薪50W打个底... 即使是做开发,其实也有很多值得研究的东西,深度和广度都有很大的学问,职业的发展也有相当大的可能。 05、最后聊着聊着,又回到了那个亘古难题,那我到底要不要考研呢? 不说了,可以参考之前聊过的文章:[《到底要不要考研?》](),其已经收录在开源项目JavaCollection中了,里面包含有自学编程学习路线、面试题/面经、心路历程、以及系列技术文章集合,资源持续更新中... https://github.com/hansonwang99/JavaCollection每天进步一点点 慢一点才能更快

June 23, 2020 · 1 min · jiezi

Webpack-技巧-联合-alias-和-mainFields-提高多库联调效率

1、多库联调场景目前在开发一个工程项目,考虑到可扩展性和功能解耦,将每个功能模块都单独拆分出来。在正式使用、单独维护某个功能包的时候没什么问题,最为头疼的是联调两个功能模块的时候,就比较掣肘了。 我们举下面的场景为例来说明: 工程项目中有 A、B、C 这 3 个功能模块,每个功能模块都是单独的一个 npm 包;其中 A 是基础工具包,B、C 是业务功能模块;C 包依赖 A 包的功能工程目录及引用关系如下图所示: 1.1、联调的难题当我们开发 C 模块的时候,需要 同时联调 A 模块的功能,而由于 A 模块是以 npm 包放在在 node_modules 中,所以我们直接修改 A 模块并没有什么用,修改的效果并不会出现的 C 模块的调试内容中。 1.2、通常的解决方案通常我们的解决方法是采用 npm link 方式解决:先在 A 模块下执行 npm link;然后去 C 模块中执行 npm link A,这样我们就能方便联调这两个模块。 然而这种 npm link 的方式在某些场景还是有限制: 如果你使用 Typescript 开发,npm link 后有可能会报错找不到 A 模块中的 xx 类型定义;这个目前我也没有找到好的解决方案。。。如果 A 包只以压缩版本发行(即 dist 目录只存 index.min.js 文件),那么你每次修改 A 文件后必须手动打包一次,那么 C 模块才会感知文件的变化触发 hot reload如果没有上述这两个问题,我以往我都直接使用 npm link 的方式联合开发,联调地也是蛮开心的。 ...

July 7, 2019 · 1 min · jiezi

做一个项目的总结

最近做了一个区块链的前端项目,react + node 全栈开发,项目是美国那边的,也算是一个国际化项目吧,和国内做项目有很大不同,有很多值得学习的地方。1. 中国的程序员把很多的精力耗费在与人沟通上,导致花费在代码上的时间大大减少,难以写出高质量的代码啊。这些沟通成本本质上还是项目管理混乱造成的。这次参与到iotx的项目中,充分认识到work flow和code review的重要性,细致到每一行代码都要review,代码质量大大提高,大的问题转化成小的,确保每个pr都是合格的才merge。当然这也需要水平较高的程序员才能hold住。并且远程工作要比在公司办公沟通成本高吧,但是整个下来并没有太大的沟通成本。布置人物的人需要把需求解释清楚(这一点有所欠缺),而程序员要在不理解需求的时候反复沟通,确认,并且能快速理解需求。2. 技术上的,这个项目采用的是flow,Graphql,react, node, koa2, mongodb,需要调用以太坊的各种api。全是我不熟悉的技术,不得不说,老外总是用这最新的技术栈。flow的使用div 宽高保持一定比例Graphql Query

April 5, 2019 · 1 min · jiezi

浅谈算法学习

我的算法学习经历 高中浑浑噩噩度过三年,大学就读于一所二本院校软件工程专业。现在的我很庆幸自己选择了这个行业,我喜欢编码,也喜欢利用所学解决新的问题,尽管熬夜是常有的事情。 在大一上C语言课的时候,我总是在想为什么主函数是main()而不是其他什么function_name(),上手的第一个demo是经典的hello world,第一次敲代码就算是照着书抄也能写错,编译错误也不会看。现在想来初学编程都会遇到这些小问题吧。#include <stdio.h>int main() { printf(“Hello World\n”); return 0;} 我很感谢这位C语言任课老师, 看得出来他是有充分的备课(应该是看过浙大翁恺老师的mooc)。并且为了让我们更好的入门编程,特地搭建了一个OJ系统,在上面布置一些C语言练习题目,也设置了一些难题。 有天老师告诉我们蓝桥杯校内选拔赛要开始了,如果通过了就能去成都参加省赛。由于当时已经快把OJ上面的30来道题目写完,我很自信地报名了校赛。结果,比赛时蒙蔽了,约瑟夫环不会也,矩阵鞍点也不会啊,总共四个题目就做出来两个题目。后来比赛人数不够啊,我也有幸去了蓝桥杯省赛。省赛那就更搞笑了。蓝桥杯喜欢考察深度优先搜索,这需要递归来实现,可我不会啊,我就一直写for循环,打了个无准备的仗。 后来得学长指点,遂买了一本算法导论,看不懂。 网上很多人推荐紫书(刘汝佳的《算法竞赛入门经典》),现在看来确实是一本极好的竞赛入门书籍。这本书和《算法竞赛入门经典-训练指南》陪伴了我整个算法竞赛的两年。 参加过许多比赛,能力不足也没能取得好的成绩。大二时,在第八届蓝桥杯决赛拿了二等奖。最后一次比赛是四川省ACM省赛,获得了银牌。 啰啰嗦嗦这么多,下面开始谈谈算法学习的一些经验体会。如何学习算法入门算法竞赛 这一部分内容说是写给想入门程序设计竞赛的读者。如果你只想要知道为了更好的工作应该如何学习算法,请看下一部分算法与项目经验。 在学过一遍C语言之后,直接上手刘汝佳的《算法竞赛入门经典》,我可以负责任地说,这本书是最好的算法竞赛入门书籍。读一本书之前,一定要仔细阅读书的前言。前言包含了基本内容、创作意图、学习指导、相对于先前版本的更新等,下面是《算法竞赛入门经典》第二版的前言: “听说你最近在写一本关于算法竞赛入门的书?”朋友问我。 “是的。 ”我微笑道。 “这是怎样的一本书呢?”朋友很好奇。 “C语言、 算法和题解。 ”我回答。 “什么?几样东西混着吗?”朋友很吃惊。 “对。 ”我笑了,“这是我思考许久后做出的决定。 ”大学之前的我 12年前,当我翻开Sam A. Abolrous所著的《C语言三日通》 的第一页时,我不会想到自己会有机会编写一本讲解C语言的书籍。 当时,我真的只用了3天就学完了这本书,并且自信满满:“我学会C语言啦!我要用它写出各种有趣、 有用的程序!”但渐渐地,我认识到了:虽然浅显易懂,但书中的内容只是C语言入门,离实际应用还有较大差距,就好比小学生学会造句以后还要下很大工夫才能写出像样的作文一样。 第二本对我影响很大的书是Sun公司Peter van der Linden(PvdL)所著的《C程序设计奥秘》 。 作者称该书应该是每一位程序员“在C语言方面的第二本书”,因为“书中绝大部分内容、 技巧和技术在其他任何书中都找不到”。 原先我只把自己当成是程序员,但在阅读的过程中,我开始渐渐了解到硬件设计者、 编译程序开发者、 操作系统编写者和标准制定者是怎么想的。 继续的阅读增强了我的领悟:要学好C语言,绝非熟悉语法和语义这么简单。 后来,我自学了数据结构,懂得了编程处理数据的基本原则和方法,然后又学习了8086汇编语言,甚至曾没日没夜地用SoftICE调试《仙剑奇侠传》 ,并把学到的技巧运用到自己开发的游戏引擎中。 再后来,我通过《电脑爱好者》 杂志上一则不起眼的广告了解到全国信息学奥林匹克联赛(当时称为分区联赛,NOIP是后来的称谓)。 “学了这么久的编程,要不参加个比赛试试?”想到这里,我拉着学校里另外一个自学编程的同学,找老师带我们参加了1997年的联赛——在这之前,学校并不知道有这个比赛。 凭借自己的数学功底和对计算机的认识,我在初赛(笔试)中获得全市第二的成绩,进入了复赛(上机)。 可我的上机编程比赛的结果是“惨烈”的:第一题有一个测试点超过了整数的表示范围;第二题看漏了一个条件,一分都没得;第三题使用了穷举法,全部超时。 考完之后我原以为能得满分的,结果却只得了100分中的20多分,名落孙山。 痛定思痛,我开始反思这个比赛。 一个偶然的机会,我拿到了一本联赛培训教材。 书上说,比赛的核心是算法(Algorithm),并且推荐使用Pascal语言,因为它适合描述算法。 我复制了一份TurboPascal 7.0(那时网络并不发达)并开始研究。 由于先学的是C语言,所以我刚开始学习Pascal时感到很不习惯:赋值不是“=”而是“:=”,简洁的花括号变成了累赘的begin和end,if之后要加个then,而且和else之间不允许写分号……但很快我就发现,这些都不是本质问题。 在编写竞赛题的程序时,我并不会用到太多的高级语法。 Pascal的语法虽然稍微啰嗦一点,但总体来说是很清晰的。 就这样,我只花了不到一天的时间就把语法习惯从C转到了Pascal,剩下的知识就是在不断编程中慢慢地学习和熟练——学习C语言的过程是痛苦的,但收益也是巨大的,“轻松转到Pascal”只是其中一个小小的例子。 我学习计算机,从一开始就不是为了参加竞赛,因此,在编写算法程序之余,我几乎总是使用熟悉的C语言,有时还会用点汇编,并没有觉得有何不妥。 随着编写应用程序的经验逐渐丰富,我开始庆幸自己先学的是C语言——在我购买的各类技术书籍中,几乎全部使用的是C语言而不Pascal语言,尽管偶尔有用Delphi的文章,但这种语言似乎除了构建漂亮的界面比较方便之外,并没有太多的“技术含量”。 我始终保持着对C语言的熟悉,而事实证明这对我的职业生涯发挥了巨大的作用。中学竞赛和教学 在大学里参加完ACM/ICPC世界总决赛之后(当时ACM/ICPC还可以用Pascal,现在已经不能用了),我再也没有用Pascal语言做过一件“正经事”(只是偶尔用它给一些只懂Pascal的孩子讲课)。 后来我才知道,国际信息学奥林匹克系列竞赛是为数不多的几个允许使用Pascal语言的比赛之一。 IT公司举办的商业比赛往往只允许用C/C++或Java、 C#、 Python等该公司使用较为频繁的语言(顺便说一句,C语言学好以后,读者便有了坚实的基础去学习上述其他语言),而在做一些以算法为核心的项目时,一般来说也不能用Pascal语言——你的算法程序必须能和已有的系统集成,而这个“现有系统”很少是用Pascal写成的。 为什么还有那么多中学生非要用这个“以后几乎再也用不着”的语言呢? 于是,我开始在中学竞赛中推广C语言。 这并不是说我希望废除Pascal语言(事实上,我希望保留它),而是希望学生多一个选择,毕竟并不是每个参加信息学竞赛的学生都将走入IT界。 但如果简单地因为“C语言难学难用,竞赛中还容易碰到诸多问题”就放弃学习C语言,我想是很遗憾的。 然而,推广的道路是曲折的。 作为五大学科竞赛(数学、 物理、 化学、 生物、 信息学)中唯一一门高考中没有的“特殊竞赛”,学生、 教师、 家长所走的道路要比其他竞赛要艰辛得多。 第一,数理化竞赛中所学的知识,多是大学本科时期要学习的,只不过是提前灌输给高中生而已,但信息学竞赛中涉及的很多知识甚至连本科学生都不会学到,即使学到了,也只是“简单了解即可”,和“满足竞赛的要求”有着天壤之别,这极大地削减了中学生学习算法和编程的积极性。 第二,学科发展速度快。 辅导信息学竞赛的教师常常有这样的感觉:必须不停地学习学习再学习,否则很容易跟不上“潮流”。 事实上,学术上的研究成果常常在短短几年之内就体现在竞赛中。 第三,质量要求高。 想法再伟大,如果无法在比赛时间之内把它变成实际可运行的序,那么所有的心血都将白费。 数学竞赛中有可能在比赛结束前15分钟找到突破口并在交卷前一瞬间把解法写完——就算有漏洞,还有部分分数呢;但在信息学竞赛中,想到正确解法却5个小时都写不完程序的现象并不罕见。 连程序都写不完当然就是0分,即使程序写完了,如果存在关键漏洞,往往还是0分。 这不难理解——如果用这个程序控制人造卫星发射,难道当卫星爆炸之后你还可以向人炫耀说:“除了有一个加号被我粗心写成减号从而引起爆炸之外,这个卫星的发射程序几乎是完美的。 ” 在这样的情况下,让学生和教师放弃自己熟悉的Pascal语言,转向既难学又容易出错的C语言确实是难为他们了,尤其是在C语言资料如此缺乏的情况下。 等一下!C语言资料缺乏?难道市面上不是遍地都是C语言教材吗?对,C语言教材很多,但和算法竞赛相结合的书却几乎没有。 不要以为语言入门以后就能轻易地写出算法程序(这甚至是很多IT工程师的误区),多数初学者都需要详细的代码才能透彻地理解算法,只了解算法原理和步骤是远远不够的。 大家都知道,编程需要大量的练习,只看和听是不够的。 反过来,如果只是盲目练习,不看不听也是不明智的。 本书的目标很明确——提供算法竞赛入门所必需的一切“看”的蓝本。 有效的“听”要靠教师的辛勤劳动,而有效的“练”则要靠学生自己。 当然,就算是最简单的“看”,也是大有学问的。 不同的读者,往往能看到不同的深度。 请把本书理解为“蓝本”。没有一本教材能不加修改就适用于各种年龄层次、 不同学习习惯和悟性的学生,本书也不例外。 我喜欢以人为本,因材施教,不推荐按照本书的内容和顺序填鸭式地教给学生。内容安排 前面花了大量篇幅讨论了语言,但语言毕竟只是算法竞赛的工具——尽管这个工具非常重要,却不是核心。 正如前面所讲,算法竞赛的核心是算法。 我曾考虑过把C语言和算法分开讲解,一本书讲语言,另一本书讲基础算法。 但后来我发现,其实二者难以分开。 首先,语言部分的内容选择很难。 如果把C语言的方方面面全部讲到,篇幅肯定不短,而且和市面上已有的C语言教材基本上不存在区别;如果只是提纲挈领地讲解核心语法,并只举一些最为初级的例子,看完后读者将会处于我当初3天看完《C语言三日通》 后的状态——以为自己都懂了,慢慢才发现自己学的都是“玩具”,真正关键、 实用的东西全都不懂。 其次,算法的实现常常要求程序员对语言熟练掌握,而算法书往往对程序实现避而不谈。 即使少数书籍给出了详细代码,但代码往往十分冗长,不适合用在算法竞赛中。 更重要的是,这些书籍对算法实现中的小技巧和常见错误少有涉及,所有的经验教训都需要读者自己从头积累。 换句话说,传统的语言书和算法之间存在不小的鸿沟。 基于上述问题,本书采取一种语言和算法相结合的方法,把内容分为如下3部分: 第1部分是语言篇(第1~4章),纯粹介绍语言,几乎不涉及算法,但逐步引入一些工程性的东西,如测试、 断言、 伪代码和迭代开发等。 第2部分是算法篇(第5~8章),在介绍算法的同时继续强化语言,补充了第1部分没有涉及的语言特性,如位运算、 动态内存管理等,并延续第一部分的风格,在需要时引入更多的思想和技巧。 学习完前两部分的读者应当可以完成相当数量的练习题。 第3部分是竞赛篇(第9~11章),涉及竞赛中常用的其他知识点和技巧。 和前两部分相比,第3部分涉及的内容更加广泛,其中还包括一些难以理解的“学术内容”,但其实这些才是算法的精髓。 本书最后有一个附录,介绍开发环境和开发方法,虽然它们和语言、 算法的关系都不大,却往往能极大地影响选手的成绩。 另外,本书讲解过程中所涉及的程序源代码可登录网站http://www.tup.tsinghua.edu.c…。致谢 在真正动笔之前,我邀请了一些对本书有兴趣的朋友一起探讨本书的框架和内容,并请他们撰写了一定数量的文字,他们是赖笠源(语言技巧、 字符串)、 曹正(数学)、 邓凯宁(递归、 状态空间搜索)、 汪堃(数据结构基础)、 王文一(算法设计)、 胡昊(动态规划)。 尽管这些文字本身并没有在最终的书稿中出现,但我从他们的努力中获得了很多启发。 北京大学的杨斐瞳完成了本书中大部分插图的绘制,清华大学的杨锐和林芝恒对本书进行了文字校对、 题目整理等工作,在此一并表示感谢。 在本书构思和初稿写作阶段,很多在一线教学的老师给我提出了有益的意见和建议,他们是绵阳南山中学的叶诗富老师、 绵阳中学的曾贵胜老师、 成都七中的张君亮老师、 成都石室中学的文仲友老师、 成都大弯中学的李植武老师、 温州中学的舒春平老师,以及我的母校——重庆外国语学校的官兵老师等。 本书的习题主要来自UVa在线评测系统,感谢Miguel Revilla教授和Carlos M. CasasCuadrado的大力支持。 最后,要特别感谢清华大学出版社的朱英彪编辑,与他的合作非常轻松、 愉快。 没有他的建议和鼓励,或许我无法鼓起勇气把“算法艺术与信息学竞赛”以丛书的全新面貌展现给读者。 需要特别指出的是,本书前11章中全部155道例题的代码都可以在代码仓库中下载:https://github.com/aoapc-book…。 书稿中因篇幅原因未能展开叙述的算法细节和编程技巧都可以在代码仓库中找到,请读者朋友们善加利用。 自学阅读完前言,相信你有很多体会吧。本来还想贴上目录,但目录很长,会让文章显得十分冗长。我给出本书pdf下载链接:https://pan.baidu.com/s/1Odoa… 提取码:1bun 请对照pdf或纸质书籍的目录继续阅读。 第一部分 语言篇(15章):书本的前五章都是C和C++基础,并不涉及复杂的算法,作者意在强化读者程序设计基础,并引导读者适应写算法题。这是一个很重要的过程–自学,学会自己构思,学会自己实现代码,学会找出bug,学会阅读作者以及其他人的代码,学会良好的编码风格。 第二部分 基础篇(67章):介绍了数据结构基础:包括线性表(包括栈、 队列、 链表)、 二叉树和图;暴力求解法:深度优先搜索和广度优先搜索,解决经典问题"八皇后"和"八数码"。 学到这里,就已经打下了坚实基础,此时参加蓝桥杯已经问题不大。现在可以开始尝试刷一些OJ的题目,国内著名OJ包括HDOJ、POJ、ZOJ,但是题目质量参差不齐。国外的包括Uva、Codeforce、SGU、TopCoder等,建议找个博客有针对性地练习。在Virtual Judge能找到很多OJ的题目。 第三部分 竞赛篇(8~12章):从第八章开始,难度急剧上升,需坚持下去。分治、贪心、动态规划、简单数论、图论基础都是参加竞赛最基础的东西。第12章不建议马上学习,应该先学《算法竞赛入门经典训练指南》。 每章的课后练习题不需要全部做,做刘汝佳推荐的一些题目就行。其实书中刘汝佳已经给出了详细的学习建议,在不同的学习章节他都给出了学习指导,这本书可以陪伴并指导你入门,但很多人都没法坚持下去。到这里,你已经掌握了算法学习的方法。当你学完前9章,你已经知道了该如何更好的学习算法,因为你找到了自己的方法,形成了自己的思维方式。 算法竞赛还需要模拟训练,就像考试一样。针对性地做一些比赛题才能在比赛中发挥得更好。 很多acmer包括我自己都在问一个问题:这本书学完就能过拿奖了吗?算法竞赛中有很多比赛,包括ACM区域赛、省赛、codeforces比赛、百度之星、计蒜之道等等,难度有很大不同,有的比赛拿奖很难,有的比赛相对容易。姑且认为读者是大学生,ACM区域赛难度大,省赛相对容易很多,但省赛想拿金牌和银牌靠前需要付出很大努力,并且不同省份获奖难度不同(以北京最为变态)。 相比于获奖,我觉得编程能力的提升才是最宝贵的。算法与项目经验 学习算法能提升编程能力,一部分人是为了竞赛,但更大一部分人是为了工作,为了通过公司的上机题目,不论是什么目的,这个学习的过程提升了编程能力。 但是我必须要指出,如果不是为了参加算法竞赛,完全没有必要学习过多的不常用算法。你只需要学习那些最基础的算法和数据结构即可,把其他的时间都用来做项目吧,提升你的项目经验。 根据自己的基础和薄弱的部分,有选择性地学习《算法竞赛入门经典》前七章即可,并试着用自己常用的编程语言来解决问题。尤其针对那些对简单算法不熟悉的同行,这本书很系统地指出了详细学习的路线,介绍了很多编程的使用技巧和优化方法,只要坚持下去很快就能达到一定水平,值得一读。 在系统的学习完算法之后,还需要大量练习,不建议去刷课后题,因为课后题太难,而且实现起来很复杂。建议刷刷LeetCode,找工作必备吧,听说很多公司面试原题呢。 公司之所以问算法题,一方面是为了提高门槛,另一方面是为了考察面试者的程序设计能力以及是否能够有更多的成长空间。 用所学去解决更多的应用问题是一件让人兴奋的事情不是吗?有一次,java老师让我们用JFrame实现一个计算器,他给了我们一个"jar包",这个包含有计算表达式值的功能,我觉得不好用,就自己用表达式树实现了同样的功能,这是一次在项目中用到算法的例子。假如老师没有给了我jar包,我也能自己实现同样的功能。如果工作中面临同样的情况,在网上也找不到代码的时候,可以利用所学自己实现所需的功能。写在最后 算法是解决问题的办法,并不是高大上的东西,任何解决问题的办法都可以称之为"算法"。学习算法是为了更好地解决问题,写出更加完善、更加高效的代码。做项目是运用所学知识的过程,需要自己建模,需要自己找出问题并解决,是编程能力和经验的体现。学习->运用->熟练->新的体会->学习->…,这是一个看似循环,实则无限发展的过程。唯物辩证法的否定之否定规律揭示了事物发展的前进性与曲折性的统一,表明了事物的发展不是直线式前进而是螺旋式上升的。 我没有讲述参加竞赛的经历,因为实在是很枯燥,如果有朋友想要交流经验,欢迎私信。 ...

February 11, 2019 · 1 min · jiezi

「Do.020」程序员该如何在寒冬中自处

首发公众号:Android程序员日记作者:贤榆的榆如果你觉得有帮助欢迎关注、赞赏、转发阅读时间:5703字 9分钟2018的寒冬似乎比2016年还要冷一些。2016年是我来到魔都的第一年,可也是那一年移动互联网的红利期也到了尾声,2016年下半年就碰上资本寒冬。记得那时,身边的很多小伙伴都放弃了继续从事android开发,有的转入了后台或前段开发,有的则彻底离开了IT行业。而我当时所在的公司也在这个寒冬倒下了。中间停滞了1个月没找到工作。记得有一句话是说历史总是惊人的相似,时间拨到2018年下半年,又一个寒冬到来,只是这一次更多的不是公司倒闭,而是一波儿裁员潮。我们先来看一张图而我再一次未能幸免的被裁员了。作为一名在两次寒冬都中标的程序员,我还是想把一些经验分享给后面的来者吧!1、了解自我,提升自我在互联网行业,很多时候,我们总有一种感觉是无论自己学了多少的新技术,都还是会担心自己一旦失业就找不到工作了。我之前一直和朋友吹牛说:“作为一名程序员,我们是靠技术吃饭的,要有一个技术人员的自信。”但这份自信又从何而来呢?在我看来,它来源于我们对自己了解。对自己的了解有很多方面,而作为技术人员当然更多的是对自我技术的了解了。而对于这一点我的建议是,在一家公司隔一段时间,你就需要别人来帮你检测一下技术水平。面试官就是那个最好的人选。所以当你在一家公司工作了一段时间(半年一年可以自己定)之后。就去招聘类App上浏览一下各公司对相关职位要求的描述。你就知道这个人才市场到底对你这个行业,又有了哪些新的技术或能力要求。这样你在工作之余的时间,也可以有针对性的去扩展自己的技能树。另外,你也需要看看各公司对你自身所对应的工作年限、学历、经验的岗位要求所对应的薪资水平是什么样的。再看看自身的薪资是什么样的。之所以让大家要关注薪资这一点,不是为了说看准了就跳槽,毕竟跳槽除了薪资以外还需要考虑自身发展、个人技术兴趣和擅长、团队氛围、公司前景、福利待遇、工作时长等等。而我强调关注市场薪资水平,是因为互联网行业职位的供需关系变化的比较快。比如17年初我被离职的后,找新工作时,就没有适当放低自己的薪资期望,导致一个月才找到工作,而新工作也只是涨薪了500。再比如18年12月和我一起被裁的ios同事,他在之前的公司工作了3年没有关心过ios职位的薪资动态,一心提升自己的技术。和我一起被裁员之后,我让帮他推简历的时候,发现他的期望薪资是15–20k。可是就当下市场环境而言,虽然比不了移动互联网红利期的时候,但是一个4年多接近5年的本科ios开发而言,拿20k以上应该有很大可能的。再加上,我对他的技术水平还算了解,也是能够担得起这个价位的活儿。所以我就建议他写了20–25k。最后他也确实拿到了这个薪资。所以了解自我的技能、薪资水平,我们都要大概了解自己所处的位置。而关于提升自我最常见的方式就是买一些课程、看一些书、进一些圈子都可以实现。需要强调的一点是不要只是看技术书籍,其他的也可以看看。而另一种方式则是通过面试提升自己,你需要从浏览的公司里选出几家进行投递,通常这些公司都会有一些电话面试,面试时记得录音。基本上有两三个面试你就知道自己当下是个什么水平,还欠缺什么了。当然这个需要注意的是,你是以自我定位和提升为目的的,所以别投太多,人家会有案底的;也尽量别请假去面试,因为你不是有心换工作(如果有心换,就另当别论),对你现在的工作影响不好。除了技术方面的总结提升,你还需要听你自己的录音积累一些面试经验。比如碰到那些你不会的问题,怎样可以回答的更加委婉或是借此凸显出你其他方面的能力。好了,这一块儿就说到这里了。2、努力工作,与人为善一个公司创造价值的过程,就是集结一群人进行协同合作完成一个或多个产品的过程。能够聚到一起,多少有些缘分。俗话说朋友多了路好走,其实不是说非要阿谀奉承或者在别人面前做舔狗。只是在别人需要帮忙的时候搭把手,上下班工作交流过程中多一些礼貌和微笑就足够给别人留下一个还不错的印象了,另外就是你在团队中是否有主见,是否认真负责,同事之间多少都能感受得到。你可能还不明白这是什么意思,我们每个人的名字都是自己的品牌,而这个品牌故事都是我们用日常去堆砌起来的。所以,如果别人刚好有工作机会,为什么他要推荐给你呢?答案就在你的名字里。除了自己公司的同事,还有就是那些想要加你微信的猎头们,其实也没必要排斥他们,可能在寒冬来临时,拉你上岸的就是你微信里的某个猎头!之所以讲这一点,是因为12月份被裁员后,我在离职当天晚上确定的offer是前同事推的。而另一个offer则是之前加我的一个猎头推的。另外和我一同被裁的ios同事的两个offer 也是我我通过以前的同事推出去的。3、找到自己的圈子在我看来进入一个行业最快的成长方式便是,进入这个行业的圈子,注意这里不是说去扩张人脉。进入一个行业的圈子。这在几年前,应该还是比较困难的,随着互联的发展,微信群、知识星球都是好的圈子。怎么说呢!拿我的星球来说吧,我加的星球差不多有这样三类或者说于我自身有这样三个目的:第一、自我教育记得逻辑思维在201的跨年演讲上讲过李希贵校长的一句话:教育的难题就是把远期的效果在当下呈现!离开大学之后,教育将不再是学校和老师的事情,而是我们自己对自己的事情,我称之为自我教育,我们都会背上一个终身学习者的标签。为此我同时加入了“任主席”和stormzhang的星球,其中一个原因就是他们都是Android开发出身的,一个偏向于纵向深入技术,一个偏向于横向多元发展。可能我并不一定能在将来达到他们那样的高度。但是通过他们两个的星球或者微信,他们已经在当下为我呈现了做Android开发的一个远期的效果。如果用李希贵校长的话说这已经解决了我进行自我教育的一个难题。我看到这条路走下去的两种成果。它让我笃定、自信的去面对未来!能够遇见一个所期望的未来,在我看来是一件非常幸运的事情,毕竟如果我在中学曾遇见过一个心之所向的未来,我可能会更加的珍惜坐在课堂里学习的机会。(最后这里强烈推荐一下,他们两位的星球的内容质量也确实非常的高,在我看来只要提一个问题就能值回那张入场券了。)第二、共同成长在李笑来的《把时间当做朋友》一书中,有一个重要的观点是——请相信,你并不孤独!在成长的道路上,最难的就是一个人孤独前行,但就像书里说的“请相信,你并不孤独”,无论你选择的或被选择的道路有多么的特别,都要相信,这个世界上一定也有人跟你走着相同的路,你需要找到他们一并前行,而加入大白和明哥的星球有一部分就是出于这方面的考量。虽然他们两无论是在公众号、工作经验和经历方面都远远走在前面,但我们却走在同一条路上,所以在我心里他们就是我的同行者。(这里也说下,他们的星球质量也都非常的不错,我也是同样强烈推荐的,我这里不是要故意避开星球的实质内容来讲,只是我的角度稍微又不一样)。第三,资源共享 其实能进入了你想进入的圈子,资源共享也就是那个圈子的一部分罢了。什么职位内推、面试经验、简历撰写、技术书籍、课程视频。关于资源共享这一块儿,一般你进入圈子的壁垒越高,分享的资料或咨询越有质量。拿只是星球来看,付费的就免费的要好很多。最后进入一个圈子,我们可能会幸运的认识一些特别厉害的人,甚至加到他们的微信。比如我也加到了stormzhang和任主席的微信,但我请他们吃饭,他们愿意来吗?用前两天我看到的一句话总结就是:“毕竟你不优秀,认识谁都没用”!我们是混技术圈儿的,千万别动不动先拿人脉说事儿!5、明确自身和公司的关系其实,对于大部分人而言,我们和公司都只有雇佣关系。之所以要强调这一点,这里有跟大家讲两个我自身的例子:第一个:曾经在大学时代,我在一家英语培训机构工作。那时候年轻,机构打造一种家文化,见谁都称为家人,而我也信以为真的把这个公司当成自己的家。我单纯的以为只要我付出,我努力。那个我也同样称之为家人的老板,他不会亏待我。可是通过长期来看,跟着他的人,从他的合伙人,到后来的核心圈子,再到跟他时间最长的人,一晃眼5、6年过去;他买了房子,买了车子。而他那些跟随者,不曾有一个人是那个公司的法定合同员工,没有一个人缴纳过五险一金。而那些所谓的员工,在现在的我看来也不过只是临时工罢了,每隔一段时间就可以换一批而已。我想这应该是一类典型的公司,以大饼、股份、期权或是个人成长和文化,来精神洗脑你为它以极其低廉的人力成本建造金字塔。“天下没有免费的午餐”我想这句话在任何时代都不会过时吧!第二个:这是我在上海呆的第三家互联网公司,也是呆的时间最短的,但我自认为是付出最多的。我进入公司是在3月底,公司缺一个ios,我把我一个刚入职了另一家公司的朋友挖了过来(注意没有推荐奖,我不是为了这个)。4月赶第一版App上线,我们差不多一个多月每天晚上都加班,有时周末也过来去上班,我也因此放弃了4月份所有的专升本考试。项目紧急,又是刚入职,心想,我们做着,老板总是能看到的。可结果是,我们的加班是按一定比例调休的,我善意的揣测这个比例是2:1(即2小时加班可调休1小时)。我们加班所有打车费也都是自费,公司对此只字未提过,我大概估算了一下差不多加起来有两千了吧。5月过后,老大跟我们说,让我们晚上晚走一个小时,要让老板看到我们的努力,至于加班的调休或补贴仍旧只字未提。而这些我也都照做了。8月份COO与CEO产生分歧,就带着集体技术部出走新公司。到了新公司后,业务有所改变,在移动端工作并不那么紧迫的情况下仍旧要求我们每天加班1–2小时,公司换了,风格依旧,对加班调休和补贴只字未提。如果公司说过什么的话,只说加班的时长会影响年终奖和来年的加薪幅度。到了12月份,公司觉得移动端人数多了,要裁掉一个ios和一个Android。而我就是那个被裁掉的Android,就在我得知被裁的那一刻,我知道我的加班,我的熬夜、我的放弃自考、我的自费打车,我做的所有额外的付出都变成了泡沫。什么核心员工,什么放一些股票期权给我们。此时此刻,我们就是单纯的雇佣关系,而这家公司决定裁掉我这个员工。仅此而已,听上去感觉是不是像个笑话?记得之前的老大还说过一句话:在有能力和很靠谱两种人中让我选择,宁愿很选靠谱的人;说不定什么时候有能力的人的一个“小聪明”会让你焦头烂额之前觉得蛮有道理的,可直到我发现可能我就是那个“不靠谱”,但有能力的人了吧。但我想说,每个人对“靠谱”都有自己的定义(比如有的人觉有效率的工作算靠谱,有的人觉得听话就是靠谱…)。但我还是那句话,我们做IT的是靠技术吃饭,我们要有一个技术人该有的自信!有能力就是硬道理我知道在互联网行业,加班是常态,加班没有加班费是常态,加班没有调休是常态,画大饼、精神洗脑压榨劳动力都是常态。但我也时常在想是不是这些变态的状态变成了常态,我们就该去无知无畏,不求回报的付出?我们就该人为刀俎,我为鱼肉的任人切割?我们就该去习惯并附和所有这些所谓的“常态”?怎么说呢,还是第一句话所说的,并且我们要始终记住这句话,我们和公司的关系就是雇佣关系,大部分公司为了获取更多的低成本劳动力可能会不停的为这层关系包裹各种糖衣,但一旦有一天需要裁员的时候,无论你谁,你和公司最终还是会回到雇佣关系。那么有没有可能跳出这样的关系呢?肯定有的,比如stormzhang和薄荷科技,共同成长,相互成就。从小职员到公司决策层。但这个不仅需要能力、人品还需要运气。最后强调雇员与雇主的关系的另一个层含义就是,当有一天你被解雇了那么你应该得到你的一切合法赔偿。应当结清你的所有假期+加班并予以n+1的赔偿。这方面,我已经看到很多人都说了,我就一笔带过了。后记从我在大学时代录制下的这个音频《生命的列车》中摘出一段话,送给在这个冬天离职和被离职的各位朋友,也送给我自己:亲爱的站台上的旅客们,你刚刚走下来的那趟列车已经开远了,让我们祝福它,也祝福那趟列车上所有的旅客。然后默默的转过头来重新招手,赶紧搭上一辆新的列车上路吧。为了下一次更好的离别与相聚,更完美的故事结局上路吧。旅途充满挑战、梦想、希望、离别,就是不能回头。善待你的时间吧,善待时间就是善待你那绚丽多彩的生命。上一趟列车上遇到的人,发生的故事,其中的真假、善恶、美丑。就让它跟随时间的流失,跟随上一趟列车越开越远吧。至于那趟列车上还有你怀念的人,请装在心里。我执着的希望,在我们大家都会到达的那个终点站,我们还会向聚。我始终希望当有天我们坐在摇椅里斜看夕阳,经历自己最后一段时光时。再回首看那些上过的列车,看那些发生过的故事时,在我们眼中将会没有了对与错,只有经历过和还没有经历。献给那个还在站台上等车的你,在站台上等久了,你也就会忘记在路上的感觉和旅途的愉悦。最后这段话送给和我一起“乘过车”的所有“旅客”:在这边,我交到了以往没有交到过的朋友,我交到了好多,可以说是知心的朋友。而且在这,我觉得我过的要快乐很多。我知道总有一天我是会离开,但意料之外是我不知道原来来的这么快,难说再见。 好了,既然难说再见,那就不说了,让我们一起开启新的旅程,相约巅峰。推荐阅读系列文章「Do.006」Android实战项目(1)——我想说“开始吧”「Do.007」Android实战项目(2)——使用Github进行版本管理「Do.008」Android实战项目(3)——Git 分支管理模型「Do.009」Android实战项目(4)——AndroidStudio插件推荐(磨刀)「Do.014」Android实战项目(5)—— gradle 配置release与debug环境分离其他「Do.002」有道云笔记–好用但不安全「Do.013」在中国,原创到底有多难?「Do.016」图解Win电脑下载腾讯视频转mp4「Do.017」如何高效使用Win电脑?「Do.018」接私活儿,是否有必要?「Do.019」2018这一年——年终总结

January 27, 2019 · 1 min · jiezi

小程序实战踩坑之B2B商城项目总结

坑一:支付完成页面,点击“完成” 按钮会触发返回的页面的onShow()生命周期 (秘坑)如下图,原以为是微信的页面,不会影响到小程序,实际情况下是会触发返回的页面的onShow()的。触发bug业务场景详细描述:因为业务需要,我会在下订单页面触发 onShow(),在onShow里面会有调取查询购物车的商品数据,如果商品数据不存在,就会跳转到首页。当用户支付完成后,返回下订单页面,触发onShow生命周期,导致调取查询购物车api,因为已经创建订单去支付了,所以购车车的商品数据就在后台不存在了,所以在 跳过去支付成功页面的那一刻,页面闪了下,异步api在执行,又立刻跳回页面首页。解决方法: self.cancelOnShow = true; self.$apply(); wx.requestPayment({ ’timeStamp’: d.timeStamp, ’nonceStr’: d.nonceStr, ‘package’: d.package, ‘signType’: d.signType, ‘paySign’: d.paySign, ‘success’: function(res) { console.log(res, ‘微信支付成功返回’); wx.setStorageSync(“isSucPay”, true); wx.setStorageSync(“orderCode”, orderCode); wx.navigateTo({ url: ‘./paymentnote’, complete:function(){ self.cancelOnShow = false; } }) }, ‘fail’: function(res) { console.log(res, ‘微信支付失败返回’); wx.setStorageSync(“isSucPay”, false); wx.setStorageSync(“repayParams”,{amount:balance,invoiceid:orderCode}); wx.navigateTo({ url: ‘./paymentnote’, complete:function(){ self.cancelOnShow = false; } }) } });onsShow(){ if(!this.cancelOnShow) { //业务代码****** }}主要是在调取支付前,通过设置 cancelOnShow 为true,然后在跳转 支付成功(失败)页面的complete回调函数,将设置cancelOnShow为false,不影响其他下次支付。有人问,将self.cancelOnShow = false;放在wx.requestPayment的 success 回调函数,在wx.navigateTo跳转之前,是否可行?我自身测试过,是不行的,原因自身体会去。其次,在onShow生命周期函数,要根据cancelOnShow来判断执行业务代码。坑二:多个倒计时重碟问题问题描述: 在一个页面如果用倒计时,如果切换到其他页面返回,会看到多个倒计时在错误重碟显示。解决代码如下: /** * 清除interval * @param that / clearTimeInterval: function (that) { var interval = that.data.interval; clearInterval(interval) }, /* * 生命周期函数–监听页面卸载 * 退出本页面时停止计时器 / onUnload:function () { var that = this; that.clearTimeInterval(that) }, /* * 生命周期函数–监听页面隐藏 * 在后台运行时停止计时器 */ onHide:function () { var that = this; that.clearTimeInterval(that) }在tab页面,运用 onHide 周期 进行 clearTimeInterval , 在 非tab页面,运用onUload() 周期 进行 clearTimeInterval。坑三:swiper的swiper-item变动,导致显示异常swiper 要根据地区选择不同的内容(swiper-item)播放动画,当切换 地区的时候,我的 swiper-item 个数也在变化, 但是原 swiper 的 current 还是之前的,比如切换2张变1张数据的时候,就会 导致swiper 不显示。解决方法和代码:坑四:微信二次授权无法再次获取授权问题获取个人地址授权,点击取消,再去获取,无反应,这个不算bug,但是可以总结下,这块是属于 微信二次授权问题,百度也可以找到相关,代码如下:通过 wx.openSetting 打开授权过的 权利,再次打开,在回调中,在执行你想要的业务逻辑即可。坑五:倒计时显示卡顿倒计时在触摸状态拖住不放的情况下,会发现有倒计时停止了,也就是所谓的卡顿,放开,或者随便动下页面又正常(而且时间恢复得特别快),暂时未找到解决方案,有知悉的同学麻烦告知。下面是我组队员志新同学总结的一些UI展示的坑位:坑六:button标签需清除默认的样式小程序button标签默认的样式不符合我们的设计稿,会出现一些比较丑的border,background等。去除button border线条button::after { border: 0;}去除button背景色button{background:none !important;}坑七:行高不够被截头小程序的标签貌似没有写 默认行高是多少。不过根据截图文本可以发现文本的蓝色底色范围框会比文本内容高一些。如果担心这些蓝色的范围影响了一些设计稿的边距 ,想要收一收它的占位间隙,那么可以将视图内的文本行高设置为 1.1~1.3之间。为什么我不推荐直接设置为行高 1 呢? 因为行高为1的话,在部分安卓机器上面有坑,会出现文字 头部 一些 笔画被 截取没了,出现貌似被砍头的效果!view,text{ line-height:(1.1 或者 1.3 ) 可以适当的收一收它默认行高的一些间隙;}被截头就如下面的图片:坑八:微信小程序通过background-image设置背景:只支持线上图片和base64图片,不支持本地图片坑九:小程序input需要调整聚焦的时候输入框和键盘的距离,增加体验感!cursor-spacingNumber 指定光标与键盘的距离,单位px(2.4.0起支持rpx)。取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离<input type=“text” cursor-spacing=“70” placeholder=“请输入具体的营业地址”>坑十:textarea层级穿透(独家秘坑)小程序的textarea 里 placeholder提示不知道为什么,存在一个非常高的层级,平时布局放着还好,要是和一个自己写的弹出层展示,就会发现 textarea的层级比你自己写的弹出层层级还要高,导致结构穿透,紊乱。不管你自己定义的弹出层层级有多高,textarea依然会把它穿透!解决办法:障眼法,在textarea同级在写一个view 仿textarea的样式,当你的弹出层 弹出的时候,把这个真实的 textarea先hidden起来,(注意不要用 wx:if因为display:none会把之前输入的备注内容消息又清没了)。然后把那个高仿的textarea显示出来。当弹出层消失的时候,就把高仿的textarea隐藏,真实的textarea显示出来。 ...

December 24, 2018 · 1 min · jiezi

主数据管理项目建设经验分享

一、主数据建设的术法道随着企业信息化系统建设逐渐增多,领导、业务部门对信息系统支撑决策、管控、业务运行难度也随之提高,导致解决业务系统间的交互困难和数据多头管理不一致等问题成为信息化建设的难点和重点。借鉴业界成熟的信息化建设思路,建设步骤分为三步:立标准通过数据标准化建设,达到关键主数据的管理制度化,数据标准化,使各信息系统遵循一套统一的数据标准。此步骤典型的建设是主数据管理系统。通数据依托统一的数据标准,基于统一的服务对接规范,实现各系统间互联互通,通达高效,系统范围涵盖横向纵向两个维度,纵向包括集团和下属单位的系统,横向包括同一组织的不同业务系统。此步骤典型的建设是业务财务一体化,业务审批流程推送。挖价值由于前面两个工作,现有系统中将存在大量标准化的、互联互通的业务数据,本阶段的建设将基于这些数据进行不同方向的深入应用建设,例如精细化深入管控体系、全面综合的战略分析能力。此步骤典型的建设是支撑领导、公司战略的独特性要求的考核、分析系统。图一:建设思路从信息化建设角度,需要按照1、2、3的顺序层层建设推进,从业务价值体现角度,需要按照3、2、1的顺序层层支撑。二、主数据建设的顶层设计根据上述建设思路,对建设方法按照业务、技术、数据三个层面进行顶层设计如下:业务架构业务架构围绕业务价值的123三个层次展开。图二:业务架构第一层技术基础价值:主数据管理实现的数据标准化、管理标准化,主数据体现的是技术层面的基础价值,支撑了第二三层价值。第二层业务直接价值:依托统一的数据标准,基于统一的服务对接规范,实现各系统间互联互通,例如业务财务一体化,第二层价值体现的是业务层面的直接价值,支撑了第三层价值。第三层战略战术价值:基于上述工作产生的标准化的数据,进行各类分析、核算、控制、管控、优化工作,对公司战略落地、战术执行的有力支撑。技术架构技术架构对123三个层次工作内容的技术落地进行了描述。图三:技术架构通过主数据管理平台建设达到各异构系统数据标准化,主数据管理平台提供数据统一建模、多源头数据清洗合并、版本管理、血缘分析、数据分发推送、数据质量核查等能力。对于多源头数据进行清洗合并,对于单来源数据进行分发同步,对于无来源数据通过可视化建模方式提供数据录入审批功能。通过企业服务总线建设达到系统标准化服务对接,企业服务总线提供服务标准化集成、数据集成转换采集、消息异步队列、统一监控运维等能力。系统间通过服务总线进行对接,达到了可插拔,低耦合的目标。通过数据仓库建设,集成元数据、主数据、业务数据、系统数据,再进行抽取装载转换分析,为各类分析、核算、控制、管控、优化工作,对公司战略落地、战术执行提供有力支撑。总之,以管理制度、技术规范为基础,通过建设主数据管理系统标准化基本档案数据,从而达到业务单据数据更加准确一致,之后通过单据的上传并进行跨组织的数据报表分析达到实时、准确的集团管控,提供战术执行底层支撑、战略落地具体体现。三、主数据建设的思路按照上述方法对企业信息现状分析,会发现有大量主数据需要建设,此时需要进行分批建设,划分原则是按照业务领域结合目前信息化建设重点进行匹配建设,达到主数据建设支撑了现在正在(规划)建设的业务系统的建设,同时业务系统建设体现出主数据建设的价值。图四:建设思路主数据建设按照管理制度制定、技术方案制定、系统开发对接、历史数据清洗、项目运营依次展开。业务、管理越复杂的主数据前期管理制度制定的工作越重要越耗时,反之业务场景简单的主数据主要工作在于技术方案和系统对接。四、主数据建设的落地方案基础数据管理系统功能涵盖基础数据的全生命周期,包括基础数据建模、基础数据建立、基础数据管理、基础数据共享。基础数据涵盖人员、用户、组织、客户、供应商、物料、项目等主数据,第一阶段可以关注某一特定领域,例如集中在与业财一体化相关的主数据。技术标准涵盖统一分类、基础数据模型、编码原则、编码规则、数据分发、数据服务、服务注册、数据推送、数据查询等。管理规范涵盖管理组织、岗位角色、管理流程、管理规范与制度、权限管理等。辅助工具该层利用应用支撑层的服务总线ESB进行系统间的接口对接和流程编排,目前使用的多个信息系统根据实际的业务需求进行对接。实现业务管理系统的可视化搭建和配置,制定相关接口与标准,实现基础数据功能的统一管理,对业务流程灵活调整和优化整合,实现用户权限设置的统一管理和认证。图五:落地方案

December 19, 2018 · 1 min · jiezi