数据结构

#数据结构#

已有5人关注此标签

内容分类

mekings

如何更便捷地本地化更新表数据结构

拿到个建表语句 ,结构跟本地的有些差异。除了输入命令逐个更新外,还有啥方式 能一键搞定的不? 😂😂

图数据库GDB小助手

存储层没懂,底层存储是什么?存储数据结构是邻接表?

存储层没懂,底层存储是什么?存储数据结构是邻接表?

技术小能手

阿里开发者招聘节 | 面试题09-14:为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他人答案)。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 这一次,不仅是知识的收获,还将间接地与技术大牛们做了直观的沟通,了解他们的出题思路与考察要点,并加以消化吸收,这对自己技术能力本身就是一种极大的提升。走上编程之路,不断丰富自己方能与世接轨,努力做最优秀的自己。 5月9日,我们给开发者的第14道面试题。 14.关于并行计算的一些基本开放问题 如何定义并行计算,请分别阐述分布式内存到共享内存模式并行编程的区别和实现(例子代码)? 请使用MPI和OpenMP分别实现N个处理器对M个变量的求和? 请说明SIMD指令在循环中使用的限制?向量化优化有哪些手段? 请用Amdahl定律说明什么是并行效率以及并行算法的扩展性?并说明扩展性的性能指标和限制因素,最后请说明在共享内存计算机中,共享内存的限制?OpenMP 是怎样实现共享内存编程环境的?MPI阻塞和非阻塞读写的区别? 阿里巴巴出题专家:何万青 点击进入聚能聊答题,并围观大家的回答! 5月8日,我们给开发者的第13道面试题。 13.如何实现两金额数据相加(最多小数点两位) 阿里巴巴出题专家:御术 数据可视化高级技术专家,从 ECharts 创始人到 AntV 产品架构师、蚂蚁金服数据可视化方向负责人,多年来一直积极推进国内数据可视化技术建设,现任蚂蚁金服-平台数据技术事业群-体验技术部-平台前端技术部 Leader,带领团队维护着 Ant Design、AntV、UmiJS、Dva 等多个领域知名的开源项目,负责着蚂蚁金服核心中台应用以及蚂蚁金融科技产品的前端研发工作。 招聘职位:资深前端研发工程师点击进入聚能聊答题,并围观大家的回答! 5月7日,我们给开发者的第10~12道面试题。 12.有一批气象观测站,现需要获取这些站点的观测数据,并存储到Hive中。但是气象局只提供了api查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据? 11.现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?请详述技术方案! 10.解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?! 阿里巴巴出题专家:江岚 阿里云数据技术高级技术专家,2010年毕业后加入阿里,一直在数据部门从事数据研发的工作。目前就职于数据技术产品部的数据建设平台,负责Dataphin智能建模的后台研发。 招聘职位:阿里数据研发工程师点击进入聚能聊答题,并围观大家的回答! 5月6日,我们给开发者的第9道面试题。 09.输入ping IP后敲回车,发包前会发生什么? 阿里巴巴出题专家:怀虎 阿里云云效平台负责人,DevOps资深专家,译有《微服务设计》。曾在ThoughtWorks任职软件交付和敏捷顾问;对持续集成、自动化测试有丰富经验;目前专注于持续交付SaaS产品的开发,提供精益需求管理、软件设计、敏捷转型相关咨询服务。 招聘职位:阿里云研发效能研发工程师点击进入聚能聊答题,并围观大家的回答! 阿里开发者招聘节 | 面试题01:如何实现一个高效的单向链表逆序输出?阿里开发者招聘节 |面试题02-08:NAS(Network Attached Storage)协议NFS和SMB相关问题

山哥在这里

阿里开发者招聘节 |面试题02-08:NAS(Network Attached Storage)协议NFS和SMB相关问题

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他人答案)。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 这一次,不仅是知识的收获,还将间接地与技术大牛们做了直观的沟通,了解他们的出题思路与考察要点,并加以消化吸收,这对自己技术能力本身就是一种极大的提升。走上编程之路,不断丰富自己方能与世接轨,努力做最优秀的自己。 5月5日,我们给开发者的第8道面试题。 08.NFS和SMB是最常见的两种NAS(Network Attached Storage)协议,当把一个文件系统同时通过NFS和SMB协议共享给多个主机访问时,以下哪些说法是错误的:(多选)A. 不可能有这样的操作,即把一个文件系统同时通过NFS和SMB协议共享给多个主机访问。B. 主机a的用户通过NFS协议创建的文件或者目录,另一个主机b的用户不能通过SMB协议将其删除。C. 在同一个目录下,主机a通过NFS协议看到文件file.txt,主机b通过SMB协议也看到文件file.txt,那么它们是同一个文件。D. 主机a通过NFS协议,以及主机b通过SMB协议,都可以通过主机端的数据缓存,提升文件访问性能。 阿里巴巴出题专家:起影 阿里云文件存储-高级技术专家,清华大学本科和研究生,电子工程系光电子和光通信专业。毕业后在两家光通信公司(Lucent和Sycamore)进行光网络产品的开发。从2011年开始进入存储行业,加入EMC2公司,主要参与文件系统的开发,六年中,参与了企业级中端产品VNX/Unity多项Block和File的特性开发。2017年2月加入阿里云文件存储团队,参与基于KV系统的文件系统开发,以及NFS/SMB相关协议开发。 招聘职位:阿里云存储技术专家 4月28日,我们给开发者的第6~7道面试题。 06. 从innodb的索引结构分析,为什么索引的key长度不能太长07. MySQL的数据如何恢复到任意时间点 阿里巴巴出题专家:近秋 阿里云数据库产品技术部技术专家,有6年的行业从业经验。2016年加入阿里云,目前负责最流行的开源数据库MySQL在阿里云的商业化的工作。 招聘职位:阿里云数据库技术专家 4月26日,我们给开发者的第5道面试题。 05.关于epoll和select的区别,哪些说法是正确的?(多选)A.
epoll和select都是I/O多路复用的技术,都可以实现同时监听多个I/O事件的状态
B.
epoll相比select效率更高,主要是基于其操作系统支持的I/O事件通知机制,而select是基于轮询机制
C.
epoll支持水平触发和边沿触发两种模式
D.
select能并行支持I/O比较小,且无法修改 阿里巴巴出题专家:寈峰 阿里技术专家,阿里巴巴百年技术大学讲师,Apache RocketMQ Committer,Linux OpenMessaging Advisory Board Member,具有多年分布式消息系统等中间件架构设计及研发经验,对云计算及分布式系统架构有深刻理解。目前负责Apache RocketMQ的研发及社区生态。 招聘职位:阿里云中间件技术专家 4月25日,我们给开发者的第2~4道面试题。 02.已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位考察点: 1.基础算法的灵活应用能力(二分法学过数据结构的同学都知道,但不一定往这个方向考虑;如果学过数值计算的同学,应该还要能想到牛顿迭代法并解释清楚)2.退出条件设计 03. 给定一个二叉搜索树(BST),找到树中第K小的节点 考察点: 1.基础数据结构的理解和编码能力2.递归使用 示例如下图,输入K=3, 输出节点值3 说明保证输入的K满足1<=K<=(节点数目) 04.LRU缓存机制设计和实现一个 LRU(最近最少使用)缓存 数据结构,使它应该支持以下操作: get 和 put 。get(key) ‑ 如果key存在于缓存中,则获取key的value(总是正数),否则返回 ‑1。 put(key,value) ‑ 如果key不存在,请设置或插入value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。 案例:LRUCache cache = new LRUCache( 2 / 容量 / ); cache.put(1, 1);cache.put(2, 2);cache.get(1); // 返回 1cache.put(3, 3); // 该操作,会将 key 2 作废cache.get(2); // 返回 ‑1 (结果不存在)cache.put(4, 4); // 该操作,会将 key 1 作废cache.get(1); // 返回 ‑1 (结果不存在)cache.get(3); // 返回 3cache.get(4); // 返回 4 测试用例: s = [["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]]] 考察点:对LRU实现的基本原理和数据结构的理解。 阿里巴巴出题专家:文景 阿里云CDN资深技术专家,浙大硕士,在高性能服务端产品开发、稳定性、服务质量优化及成本优化等各项功能都有10年以上的经验。在网易杭州研究院负责底层开源软件研发,国内最早核心Nginx研发人员之一,曾任tengine研发负责人,热衷于参与开源项目。现在是CDN技术负责人,连续7年服务双11,保障整个阿里集团95%以上的流量分发稳定性。从2014年开始,从0到1构建阿里云CDN的商业化基础设施,包括点播、直播、动态、安全加速等各项产品线,阿里云CDN现在是中国用户数最多的CDN、也是国内规模最大的CDN。正在将CDN打造成互联网的基础设施,为全球用户提供接入、加速、安全的稳定服务。 招聘职位:点此进入查看CDN大量职位并投递简历 以上几道道面试题你都会吗?快来解答! 围观4月24日的面试题:如何实现一个高效的单向链表逆序输出?

云攻略小攻

千万QPS的缓存!Redis 5.0最新的Stream数据结构,你还在等什么?

讲到Redis大家都很熟悉,Redis是意大利西西里岛帅哥Salvatore Sanfilippo的开源作品~,2009年诞生,走到2019年已经十周年了~Redis最大的特点就是快,访问延时在1ms内,同时单实例性能就能达到10w+ QPS,中国互联网典型的场景就是用户多、高并发,所以各大互联网公司都对Redis有深度的使用。作者最新推出的Redis 5.0增加了Stream的数据结构, 它是一个新的强大的支持多播的可持久化的消息队列。本次阿里云将推出全新版本的Redis 5.0,在提供社区功能的基础上提供了更多的企业级的特性~ (1)审计日志:提供操作日志、敏感日志、慢日志的审计能力~对于重要的数据变更能做到可以追溯(2)大key分析能力: Redis使用过程中经常因为业务使用不当引起大key的问题,为此阿里云Redis在服务端提供了大Key的分析能力,当前分析能力覆盖了Redis 4.0、5.0的版本~,可以为客户分析后端数据的内存使用情况。同时在本次发布会我们还将对阿里云Redis的性能增强版本和混合云解决方案进行介绍~对于性能增强版本我们通过多线程突破了开源Redis单线程的瓶颈,整体的QPS能力能达到社区的300%,对于混合云的解决方案客户可以通过redis-shake搭建同步通道,通过redis-full-check搭建数据比对通道,客户可以在业务上灵活配置访问流量,保证企业客户的上云流程~云数据库Redis 5.0重磅发布会,直播入口 支持全新Stream 数据类型,给您不一样的缓存体验,快速查看! 你优秀,你来说:1、您在什么样的业务场景下会使用Redis?一般是单独使用还是组合其他数据库共同使用?2、您对于Redis Stream的应用场景有什么希望了解的,对于消息队列的选型有什么历史经验?3、您希望阿里云Redis提供哪些功能帮助您解决日常使用问题?

李博 bluemind

怎样将 MongoDB 数据库里的 collection 复制到另一个 MongoDB 数据库里

如题。由于数据结构变更,进行数据迁移,怎样将一个数据库里的某个 collection 复制到另一个数据库里

李博 bluemind

mongoose如何返回特定时间段数据

假定数据结构如下: { userid:1111, data1:[ {title:'test',content:'test',createTime:'2019-03-25T09:24:00.000Z'} {title:'test',content:'test',createTime:'2019-03-25T09:24:00.000Z'} ] },{ userid:2222, data1:[ {title:'test',content:'test',createTime:'2019-03-25T09:24:00.000Z'} {title:'test',content:'test',createTime:'2019-03-25T09:24:00.000Z'} ] }userid字段为用户唯一标识,我现在想要拿到某个用户data1里特定时间段的数据,应该怎么做?### 问题描述 问题出现的环境背景及自己尝试过哪些方法我执行以下代码段返回了所有时间段的数据,并不能达到要求 const start = new Date(2019,3,1)const end = new Date(2019,3,31)schema.find({userId:req.body.userId,"data1.createTime":{$gte: start,$lt: end}})相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码) 你期待的结果是什么?实际看到的错误信息又是什么?

KevinPan

阿里云SDK c++版本函数QueryProductList返回结果不全

阿里云SDK c++版本(aliyun-openapi-cpp-sdk)调用函数QueryProductList返回的结果中无产品的详细信息(list的size为0)。返回的数据结构如下: struct Data { struct ProductInfo { long gmtCreate; std::string description; std::string productName; int nodeType; int dataFormat; std::string productKey; int deviceCount; }; int pageCount; int pageSize; int currentPage; int total; std::vector<ProductInfo> list; }; 从设计上来说,list变量的作用应该就是用来存放产品的信息的,而且python版本的返回结果是有的,所以感觉此处会不会是个bug,还是我使用的方式不对?

李博 bluemind

mysql的数据结构?

mysql的数据结构?

python小能手

在不使用循环的情况下从文件中读取逗号分隔值?

如果文本文件的每一行看起来像这样 Carlos Guestrin,CIS 41A,4.5,A,BUS 55,5,A,BUS 18,5,B+,HUMI 16,4,A-如何在不使用循环的情况下将所有数据读入数据结构?我想将名称(Carlos)作为实例变量,只将名称后的值存储到数据结构中,即元组字典(类名作为键值)

黄二刀

[@talishboy][¥20]如何将数据结构及算法运用到实际的Java程序开发中?

如何将数据结构及算法运用到实际的Java程序开发中?

黄二刀

[@小川游鱼][¥20]有没有专门介绍Java数据结构和算法的书籍或技术文章?

有没有专门介绍Java数据结构和算法的书籍或技术文章?

月下丶

[@小川游鱼][¥20]Java虚拟机的堆、栈、堆栈如何去理解?

我只片面的知道堆和堆栈是一种存储结构,栈是一种数据结构

flink小助手

有什么方法增加任务管理器的数量而不是每个任务管理器的任务槽?

存在两个影响任务可用资源量的维度: jobmanager的数量TaskManager可用的任务槽数。每个TaskManager有一个插槽意味着每个任务组在一个单独的JVM中运行(例如,可以在一个单独的容器中启动)。拥有多个插槽意味着更多子任务共享同一个JVM。同一JVM中的任务共享TCP连接(通过多路复用)。它们还可以共享数据集和数据结构,从而减少每任务开销。 在文档中使用这一行,似乎总是错误地增加每个任务管理器的任务槽数而不是增加任务管理器的数量。 具体方案:如果我在Kubernetes中部署了一个作业集群(让我们假设有16个CPU核心可用)和一个由一个源+一个映射函数+一个接收器组成的管道,那么我将默认使用一个具有16个可用插槽的TaskManager到那个TaskManager。 这是最佳配置吗?是否有一种情况是每个插槽有一个插槽,或者可能是TaskManager和插槽的组合,可以利用所有16​​个CPU内核?

社区小助手

Flink滑动计数窗口行为

假设我们有这样的数据结构: Tuple2, Integer>第一个字段是ArrayList长度为1的字段,其中包含一个时间戳,而Integer字段是一个1到40之间的数字channel。目标是使用相同的密钥(channel)聚合每400条消息并应用ReduceFunction它们(它只合并元组的第一个字段中的400条消息的时间戳)。我将channel字段设置为消息的键,并创建一个400的计数窗口。例如,如果我们有160000个消息作为输入,它应该输出160000/400 = 400行,并且计数窗口按照需要工作。问题是当我使用Sliding Count窗口时,我的预期行为是: Flink为每个channel数字创建逻辑窗口,并ReduceFunction 在第一次应用时,如果逻辑窗口的长度达到400,那么每100个输入数据(与逻辑窗口的密钥相同的密钥)将调用ReduceFunction最后400个消息。窗口,所以我们应该: 160000 - 400 = 159600// 第一个400输入将首次调用reduce函数159600 / 100 = 1596 // 在第一个400输入之后,每100个输入Flink调用最后400个输入的reduce函数1 + 1596 = 1597 //输出的行数但是运行Sliding Count窗口,它输出1600行,其长度可变。(我预计输出长度只有400) 要点:说长度我的意思是ArrayList的大小(Tuple2的第一个字段) 前40个频道 - >长度100第二个40通道 - >长度为299第三个40通道 - >长度为598第四个40通道 - >长度为997遗体40通道 - >长度400我如何证明这种行为并实现我想要的滑动计数窗口? 这是源代码: DataStream, Integer>> data ;data.keyBy(1).countWindow(400, 100) .reduce(new ReduceFunction<Tuple2<ArrayList<Long>, Integer>>() { @Override public Tuple2<ArrayList<Long>, Integer> reduce(Tuple2<ArrayList<Long>, Integer> t0, Tuple2<ArrayList<Long>, Integer> t1) throws Exception { t0.f0.add(t1.f0.get(0)); return t0; } }).writeAsText("results400").setParallelism(1); 更新:根据@DavidAnderson的建议,我也尝试在ReduceFunstion而不是修改中创建一个新的元组t0,但它产生了相同的输出。 public Tuple2, Integer> reduce(Tuple2, Integer> t0, Tuple2, Integer> t1) throws Exception { ArrayList<Long> times = t0.f0; times.addAll(t1.f0); return new Tuple2<>(times, t0.f1) ; }

微wx笑

同样是程序员,为什么别人比你更优秀?

随着互联网时代的飞速发展,越来越多的人投身于软件开发行业,大家都称他们为程序员,或者码农。 这些程序员的水平也是参差不齐的,有些人从比较好的学校毕业,水平却一般般;也有些人从一般搬的学校毕业,但是水平很高,因为他们付出了比其他人更多的努力;也有些人,不管是好学校还是差学校,毕业了都跑去培训班培训了,出来的也是良莠不齐的。 今天这个话题,我们不从这些客观因素上去分析,就如题,同样是程序员,为什么别人比你更优秀?我结合自己的一些经历和经验,以及从身边优秀的人身上学习到的经验,从主观上去总结几点,你来评评是否有道理。 不要吝啬投资自己 站在巨人的肩膀上 了解数据结构和算法 用熟练一款开发工具 写代码要规范 不停地给自己充电 计划、坚持与执行力 放低自己的姿态 任何人都是从0开始往上爬的,你的背景好,可能快一点,别人差点,可能就会慢点,但是这不能说明别人就不够努力,我很佩服那些先天条件差,但是却非常努力的想要提升自己的人,我特别愿意给这些人帮助。我的粉丝当中,有很多很多还在学校读书的学生,也有很多大专生,这些粉丝在微信里跟我聊天,让我指点指点(当然,指点不敢当,我一般都是建议和分享),我都会耐心的把自己的想法结合他们的处境,给一个我觉得比较好的建议。别人来问我是看得起我,我能帮上忙的,基本上都义不容辞。 所以,如果哪天,我们牛逼了发达了,一定不要趾高气昂。人,不能有太多的棱角。这个社会,还是要靠朋友的。善待周围的朋友,放低自己的姿态,是对别人的一种尊重,同时,也是自己修养的体现。它也是决定一个人能否成功,能走多远的关键因素之一。 那么:1、你觉得上面总结的几点对吗?针对上面几点你有什么想说的,或者切身体会感受。 2、除了上面几点,你还有没有想补充的? 3、一个人能否成功,能走多高,能走多远,你认为都和哪些因素有关?

hbase小助手

问一下我如果广播一个变量(二元组,数据长度在一万)想获取这个广播变量的数据,需要变成将这个变成map数据结构获取,还是自己写给二分搜索快

问一下我如果广播一个变量(二元组,数据长度在一万)想获取这个广播变量的数据,需要变成将这个变成map数据结构获取,还是自己写给二分搜索快

hbase小能手

多个不同的数据源如何同步到hbase

有多个数据源,分布在不同的地区,各个数据源的数据库以及数据结构都不一样。要定时提取众多的数据源的数据,定期提取新的数据,并整合到同一个hbase里面,结构也统一,有没好的解决办法。

海阔天空yy

很认真的聊一聊程序员的自我修养

首先要谈的是,今天的话题所聊的程序员包含哪些人? 在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具 大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员。在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量。对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些“自我修养”,是最基础的,是普世的。 所以今天的话题面向的程序员,就是所有的正在写代码或者曾经写过代码的程序员,也包括广义上的程序员,例如项目经理、架构师等等。做任何事都是有明确目的,那么 再谈一谈,程序员提高自我修养是为了什么? 程序写的好有人崇拜,有妹子喜欢?还是到博客、论坛、社区发表文章进行分享获得成就?我想这是少数人的追求,也是更高的追求,在这之前 我认为,在中国,程序员提高自我修养的目的,是为了1、更好的融入工作,减少困难,增加成就2、稳步的提升能力,提高收入,达成财务自由2、站在更高的层面看待自己的学习和工作,树立更加适合的人生观价值观,家庭幸福,生活愉快说的更通俗一点,就是用更加合理的方式和方法,赚取到更多的收入说了这么多废话,进入正题 何为程序员的自我修养? 正面论述很难说清楚,反向描述可能更通俗易懂一些,自我修养的对立面是“没有修养”,先说一说在这么多年的工作、学习、生活中,遇到的一些我认为“没有修养”的程序员形态: 1、程序员小张遇到了一个开发问题,很着急,想到了有几个群,于是到群里发了他的问题,坐等回答,发现没有人回答,就直接对话群主的QQ,群主也不回答,于是小张就搜索,突然搜到博客园有个帖子讲解了相关话题,他看完就给博主留言,我的邮箱是:XXXXX@qq.com,麻烦博主把源码发给我一下,谢谢。 2、程序员小张进公司3个月了,老板布置了很多任务,他觉得老板很没人性,工资给的不高,加班也不给钱,于是在写代码的时候能省就省,客户反馈有问题也不主动解决,敷衍为主,又过了一个月,跳槽了。 3、程序员小张正在写一个功能模块,需要进行某种加密,到百度搜到了一个编码模块,看不明白具体写了什么,但是放到程序里刚好适用,于是就这么原封不动放进去了。 4、程序员小张要对某个功能进行研发,项目经理对他说,这个功能应该能搜索到,你去搜搜看,小张就在百度搜啊搜,一天过去了啥都没找到,项目经理来到小张身边坐下,换了个关键词,1分钟就搜到了解决方案。 5、程序员小张学.NET已经工作3年了,工资还是10000,和公司提涨工资也没答应,想跳槽又犹豫,这时某个前辈对他说,你去看书吧,多看一些书,例如 《Visual C# 从入门到精通》,《CLR via C#》《Javascript权威指南》等等,于是小张买回来了, 随手翻了翻发现有些东西是他已经会的,有些看不懂的好像又用不到,而且书这么厚,要不要浪费时间去看呢?小张就这样反复纠结了半年,依然每天上班工作,下班LOL,偶尔还抱怨一下工资低。 6、程序员小张到了一家新公司,在做一个项目实现某个功能时,想起来以前做过这样的功能,可是竟想不起怎么实现了,于是就到自己电脑上找文档,找了好久也没找到,只好放弃,最后又折腾了2天,终于还是把这个功能给实现了。 7、程序员小张某天非常不高兴,因为他的项目经理和项目组的产品人员又变更需求了,新的需求又要对整个结构进行大的调整,小张很郁闷,到一个QQ里发泄情绪,说了这个事,于是立马,QQ群里面炸开锅了,程序员小李说,对,产品就是狗日的!程序员小王说,对,他妈的项目经理整天高枕无忧,就知道压榨开发人员!程序员小孙说,是的是的,我上一家公司也是这样,压榨程序员,幸好我走了。就这样,在一片骂声中,几个程序员心情舒畅了,小张开心的去玩王者荣耀去了。 我想,有些人可能已经明白我要说什么,有些人可能还不明白,具体的话我也说不出来,只能用一句话来概括就是: 在编写代码的过程中,善于学习、掌握方法、勤加思考、勤奋努力、持之以恒,长此以往,在编程中,你会发现不一样的自己。 以上这些还是比较抽象,那么 提升自我修养的具体方法有哪些? 程序员具体如何达成“较高的修养”,每个人各有自己的办法,我无法说到很细,就和如何提高做人修养一样,一句两句话是说不清楚的,但是有些说法也通俗易懂,比如一个小孩,有教育良好的父母,父母彬彬有礼,小孩从小开始接受正规教育,小学、初中、高中、大学,然后文化课程和社会实践良好,那么这个小孩最终的做人修养,一定比没有经历过这个过程的小孩更好一些。 同样的,写程序也是如是,下面我就讲一些最基本的、最浅显易懂的学习方法和道理,我把它叫做: 程序员基础的基础一个好的开发人员,应该能够全面、高效、严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标,但仅能够熟练的进行代码编写是不够的,更要能深刻的理解技术原理和业务逻辑,扎实的个人基础和技术基础往往会促进代码的编写,更游刃有余的解决问题。 下面说的一些基础,可能绝大部分开发人员都不会在意甚至忽略,但恰恰这些才是开发大厦的基石。 1、科学基础成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员,写出更高质量的代码,计算机基础学科的学习,是非常非常非常(重要的事情说三遍)重要的。具体的来说,基础学科在实践应用中,有如下几门是一定需要的,按照学习顺序排列如下 1)数据结构 数据结构课程通俗的说就是告诉你如何用最基本的语言类型、变量,关键词语句等,去处理各式各样的逻辑问题,我们称之为算法,而日常编程中的各种问题,例如排序、文件夹遍历操作、数据库查询等,都可以在数据结构课程中,找到对应的数学原型。数据结构课程的理解能力,也是一个人数学能力的体现,数据结构学习的好坏,是程序员水平差异的一个重要分水岭,对于这一块内容的学习,有如下建议:使用VB、C、C++、Pascal等语言,买一本相关语言数据结构与算法的书,或者在网上下载相关的PDF电子书,完整的学习一边,并将书本中的所有案例亲自编写运行调试一遍,当能够领悟到某些日常编程中常见手法源于某些数据结构和算法时,就基本达到了学习效果。 2)操作系统 所有编程语言的开发以及应用的运行,都基于操作系统,桌面编程中的大部分场景包括内存、进程、文件系统、网络通讯、用户界面等,都源于操作系统的定义和概念,完整的了解操作系统的起源和组成以及运行逻辑,对多线程、复杂界面、文件管理以及一些难以正常理解编程思路等开发中遇到的场景,有非常大的帮助,不仅帮助理解,也能掌握更多有效的程序写法。具体可以买一本操作系统的书或者下载相关PDF电子书,完整的浏览一遍,做到能够结合实际编程场景来看待操作系统原理,就基本达到了学习效果。 3)数据库 传统的关系型数据库,入门简单,深入却难,往往开发人员能够较快的掌握增删改查、视图、索引、存储过程等基本数据库操作,却在编写复杂查询、设计主外键、优化字段、去除冗余等时,出现只会依葫芦画瓢却不能自主思考扩展的状况。究其原因还是没能了解关系数据库的根本原理,而数据库这一门课程,系统的阐述了关系型数据库的来龙去脉,了解其中的数学原理或逻辑基础所在,对提升数据库编程水平有质的影响。建议也是买一本数据库的相关书籍或者下载PDF电子书,能够把熟练的把第一范式、第二范式等数据库课程的基本知识点与数据库编程场景建立起关联,也基本达到了学习效果。 4)编译原理 编译原理是编程语言以及各类语言编译器的科学基础,可以说编译原理创造了世界上的几乎所有的IT应用,学习编译原理的基础是数据结构和算法,因此编译原理的学习要花费更多的时间和精力,由于现代高级编程语言的编译器,在代码优化、资源优化方面已经做的足够智能,因此,编译原理的学习对实战的影响越来越小,但是正所谓本盛末荣,如果认为自己对数据结构和算法的学习达到了一个较高的水平和状态,可以在编译原理学习上进一步深入,最终把自己和普通程序员拉开更大的差距。 2、英语能力 英语的天然特性和字母长度还有学科发展的历史因素,决定了编程语言一定是基于英语的,在编程过程中,从语言的关键词到文档的内容又或是搜索引擎的搜索结果,都不可避免的会遇到英文。大部分编程人员,都具备英语四级左右的英文基础,却由于非专业以及工作环境原因,逐渐疏远甚至完全淡忘了英语。而实际操作中,大部分编程语言资料都是英文,在线编程问答内容也是英文,因此,很有必要把英语能力重新恢复到一个不用太高但行之有效的水平,达到如下效果: 1)对自己所使用语言,每一个关键词都知道具体的英文翻译、逻辑含义以及读音。 2)对于自己使用语言所涉及到的相关方法、类库、框架、工具等,能知道其中每一个方法、过程以及参数关键词等的英文翻译、逻辑含义以及读音。 3)对常见的编程逻辑和核心关键词,能够用英文组织问题的描述,最简答的也行,只要能被搜索引擎读懂就可以。比如如何在C#中把整形转换为字符串类型这个问题,最简易的英文描述就是 C# Integer Covert To String。 4)在自己技术知识范围内的任何的英文的技术手册、文档、文章或是问题描述,能够读懂8成的内容含义,能够读懂完整的技术含义。 3、搜索方法 任何一个开发人员,都应当具备搜索能力,甚至是一定要具备搜索能力,搜索引擎的宝藏,是无穷无尽的,同样具备搜索意识的不同程序员,却因为搜索技巧的差异最终在程序开发质量、项目实施效率、甚至是工程产品质量上出现数倍的差异,因此,掌握高效、先进、灵活的搜索方法和技巧,是非常非常非常(重要的事情说三遍)有用的。其中主要的方法介绍如下: 1)搜索源选择 虽然英文的编程资料更为准确高效,但中文的编程资料数量上却占优,因此遇到问题第一搜索选择还是百度谷歌对于专业中文词汇的处理能力有时候甚至比百度还要强,而且谷歌能搜出大量的英文资源,因此谷歌也是首选之一,但是由于谷歌被封锁,因此需要进行VPN、SSH等FQ操作,或者在百度搜索“谷歌镜像”关键词,通过谷歌的镜像网站进行访问。除了搜索引擎,专业的技术网站、论坛、社区也是非常直接有效的搜索源,比如国外的StackOverFlow网站,国内的Cnblogs博客园、OSChina开源中国等,都具备搜索功能,将问题关键词输入其中,也许也会很快的得到相关答案。对于QQ群,建议不要使用,除非QQ群主或者成员是非常闲或者非常非常热心的人,否则在QQ群询问技术问题,是非常低效率的搜索方式。2)关键词构造 搜索关键词的构造,直接影响搜索效率和正确结果的过滤,没有什么特别的技巧,关键在于搜索积累,但是总体遵循的原则是,准确和简洁,比如当出现一个描述,如何用C#对XML进行序列化和反序列化,非常愚蠢的关键词构造就是“如何用C#对XML进行序列化和反序列化”,而正确高效的关键词则是“C# XML 序列化 反序列化”,或者在谷歌里面搜索则是“C# XML Serialization”。在平时的编程中,一定要注意相关方法和经验的积累 3)联想搜索 联想搜索,不属于搜索引擎的范畴,却是在搜索中很有用的高级技巧,举一个通俗的例子,比如想使用C#,利用某个.NET类处理一种HTTP通讯,但是一直搜索不到完美的结果,不过换个思路,考虑到VB.NET也是.NET体系,和C#完全相通,那么也可以试着用VB.NET关键词进行搜索,搜索到完美代码后再临摹成C#代码。这样的联想搜索,不仅能够帮助搜索正确结果,也是对大脑思维的训练,值得多多尝试。 4)资源搜索 开源的框架、产品、工具、控件等开发辅助类东西越来越多,稳健性和迭代性越来越强,去寻找一款成熟的工具或者插件,也成为了大量开发者的必备方法和技能,而如何高效的搜索出想要的资源,也成为了一门学问,其核心方法就在于知晓资源网站的地址,常见的例如有开源中国、Github、CSDN下载、pudn等。资源类网站需要平时多积累,到用到的时候会非常关键。 4、思维模式 开发人员,一定要养成业务思维的模式,所谓的业务思维,就是在做任何一个项目的时候,写任何代码前,需要对项目本身的业务概念和业务逻辑甚至业务流程都要有一个全面的学习和理解,这虽然不是一个项目的强制要求,却是一个很好的开发习惯,无论自己的觉得是开发者还是测试员又或是技术总监,掌握了业务原理,才能够更好的设计或阅读项目的数据结构和流程结构。程序员的思维往往和用户或者客户是不一致的,摆脱技术思维模式,习惯于用业务思维解决问题的程序员,不一定最优秀,但一定是一个很容易沟通的程序员 5、工作与编程习惯 有的人说爱干净浪费时间,所以不修边幅,但归根结底这还是习惯问题,当养成清洁卫生的习惯并使之成为生活惯性时,往往就不会耗费更多的时间,反而显得干净干练。写程序同样如是,有一些编程习惯,看似不足为道,看似浪费时间,可是如果坚持下去,最终都能收到意想不到的奇效。下面列举一些特别重要的习惯。 1)快捷键的使用 无论是使用Windows、Linux操作系统,还是在IDE中,快捷键都是系统本身的标配,事实上,Ctrl+C、V这样的操作,大部分人都能尝到在节省时间上的甜头,把这个概念进一步扩散,如果在IDE中编写代码,除了代码本身,将其余所有的鼠标操作、键盘定位操作,都用快捷键来代替的话,在时间上将会有数量级的节省,然而看上去这么好的事情,真正坚持去执行并形成习惯的人屈指可数,因此,在初期的改变习惯,记住快捷键,会是一个长期的过程,需要不断的坚持。 2)代码注释 一个开发人员随着年龄和经验的增长,所参与的项目,再也不是靠一个人或者几个人就能完成的。系统的重构、代码的重构、工作的交接、对新进人员的培训等等类似的事情,会越来越多的遇到,这些事情无一例外都会把已经写过的代码重新或者重复阅读,如果在初始编写代码时,就做到完整、清晰明了的代码注释,对后续工作会有巨大的帮助。不仅提高工作效率,还能增强合作好感。事实上,就算只是自己看自己的代码,如果有注释,也能加深印象,缩短代码查找时间。因此,任何开发人员,都应该养成良好的代码注释习惯。 优秀的代码注释应该能做到: 每一个函数、每一个属性甚至是变量的划分,都可以找到对应的解释。多使用越来越被IDE支持的XML注释方式,不仅有注释文字,更有详细的参数描述。对程序结构、模块、组成部分划分等也加以注释3)命名规则 具备一定规模的软件公司,在代码编写上都有一套自己的命名规则,涵盖项目、模块、函数、变量等等,标准化命名的好处不言而喻,然而被动、被迫去遵守命名规则和主动习惯于使用命名规则是完全不一样的。一个优秀的开发人员,应当发自内心的希望各种代码命名都是有规则的,易读的,而不是纠结于命名规则会增加码字长度。 4)不将就的编程逻辑 所谓不将就的编程逻辑,其对立面就是不讲究的编程逻辑,不讲究的编程,不仅是一种很坏的编程习惯,也体现了低下的生活品质,很多开发人员,因为个人习惯、赶工期、客户要求不高等多种原因,在编程时特别随意,体现在比如为了实现某个功能,百度出一段代码,直接套用,10行的代码只理解8行,有两行看不懂也放到程序里去使用,很多这样的小细节,就好比在项目中埋下了无数的定时炸弹,不仅有很大概率形成返工,更是为项目埋下了风险。编程人员,应当有担当有态度,养成不将就的编程逻辑,不勉强自己,也不轻视程序。 5)数据备份 误删、误操作、电脑断电、文件遗失等等状况是每一个开发按人员都可能遇到的问题,如果不希望辛勤的劳作被浪费,不希望偶然的意外影响工作,那做好备份是必不可少的,在较大规模的公司,会有完整的源代码管理以及信息安全防护,而无论是在大公司工作,还是身处较小公司或者在实现个人代码价值时,都要做好代码和文档的数据备份,备份方式的选择灵活多样,有使用在线的CVS、SVN、TFS、Git源代码管理,也可以手工拷贝文件至云空间或者本地硬盘,甚至可以在个人电脑上组成RAID磁盘阵列等等,养成周期性、规律性的备份习惯。 6)邮件工作方式 沟通是进步的源泉,如果说开发小组的热烈讨论是性格和激情的体现,那邮件的工作方式也是另一种稳重和高效。无论是公司层面的工作沟通,还是开发小组的问题交流,邮件的作用包括问题正规化描述、工作留档留痕、工作流程流转、责任分工明确等等,习惯于将重大问题、重要事项通过邮件的方式与同事、主管等进行沟通,将会非常有助于团队协作。 以上这些方法,是我这么多年来的感受和体会,也给了我很大的帮助,希望也能够帮助到大家,不能说一定可以“提升修养“,但也是”提升修养”的有效方式。 最后还想再说一说坚持的力量 分享一个真实的小故事,公司有两个开发人员,1个做.NET好多年了,但是很油滑,做事能省就省,抓到可以偷懒的机会就偷懒,让他学点新知识新方法总是自以为是觉得自己都会;还有1个毫无.NET基础,一直做低级语言开发,从15年才开始学习.NET和Web前端,但是做事很积极,几乎每天都自己抽空学习,遇到不懂的都琢磨清楚,遇到不会的场景就上网或者找人寻求帮助,项目结束后还反复思考有什么地方可以改进。从15年到现在,短短1年,这两个人的发展已经是天壤之别,工资差距也越来越大,后者已经能够独自操盘中小型软件外包项目,而前者还在混着日子,以后他们各自的发展也完全可以预见。 我想说的是,本篇里面分享的一些道理和方法,都是通俗易懂的,就和常听到的例如101%和99%的365次方的故事、1万小时的道理等等一样,但真正去认真思考并实践的屈指可数,也许,坚持才是程序员最大的修养,和各位共勉!下面问题来了1 你认同上述的说法吗?2 你还知道程序员其它方面应该注意的地方吗?3 您对自己的未来有什么规划?