<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>这些 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E8%BF%99%E4%BA%9B/</link><description>Recent content in 这些 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 02 Nov 2017 23:21:38 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E8%BF%99%E4%BA%9B/index.xml" rel="self" type="application/rss+xml"/><item><title>java多线程高级教程，这些你都懂了吗？</title><link>https://pangyd.com/post/153-java/</link><pubDate>Thu, 02 Nov 2017 23:21:04 +0800</pubDate><guid>https://pangyd.com/post/153-java/</guid><description>&lt;p>一、countdownLatch和cyclicbarrier（这两个做多线程控制很好用，工作中会经常用到）&lt;/p>&lt;p>countdownLatch：主线程阻塞，当多个线程countdown到0，主线程执行；&lt;/p>&lt;p>cyclicbarrier：多个线程等待，当都处于等待状态了一起执行（类似于赛跑机制）&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="641" img_height="517" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p class="pgc-img-caption" style="text-align: center">countdownLatch&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="677" img_height="385" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p class="pgc-img-caption" style="text-align: center">cyclicbarrier&lt;br>&lt;/p>&lt;p>二、volatile和threadlocal&lt;/p>&lt;p>这两个也要很好掌握，不仅常用，而且面试时候也经常问到！&lt;/p>&lt;p>volatile:使属性可见性。有个属性是共享属性，这个关键字会在每个线程内开一块内存，每次子线程都会从主线程拿最新的属性放到内存中。但是有个问题，他只是拿最新的，比如：计数器，每个线程都执行+1操作。一个线程+1，另外两个同时读取这个属性，那么不会加2次，而是只加一次，这就是valatile不能保证原子性的原因。&lt;/p>&lt;p>threadlocal：用于做方法外的全局属性。这个跟volatile刚好相反，使全局变量独立，每个线程里都有一份独立副本。&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="770" img_height="261" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p>这是hibernate的源码，如果当前线程没有session就openSession放到ThreadLocalMap中，每个线程的session都是独立的不会相互受影响。&lt;/p>&lt;p>三、AtomicInteger：支持原子性计数器。&lt;/p>&lt;p>之前说volatile不能作为计数器，那么多线程计数器要用atomic类的AtomicInteger&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="977" img_height="576" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p>四、并发类容器&lt;br>&lt;/p>&lt;p>ConCurrentHashMap、CopyAndWriteArrayList、CopyAndWriteArraySet。&lt;/p>&lt;p>ConCurrentHashMap（底层分成16个hashtable来保证并发）读支持高并发读，写和删除时候只支持16个线程，所以一般也要上锁； copyandwrite支持高并发读，写的话要加锁（原理是，写的时候赋值一个容器，写好了把指针指向新容器并且删除原容器）&lt;/p>&lt;p>map、list、set都有并发类容器。面试时候经常会问hashmap和ConCurrentHashMap区别。这个demo我就不写了，用法和我们平时用的集合都一样，只是他们不会造成线程不安全。&lt;/p>&lt;p>五、并发类队列&lt;/p>&lt;p>阻塞的意思是，当达到队列最大容量或者为空，线程还往里加东西或取东西会被阻塞；有界意思，可以设置队列大小。&lt;/p>&lt;p>（非阻塞队列）ConcurrentLinkedQueue无阻塞无界限队列（高并发性能最好，peek取出不删除，poll取出删除），&lt;/p>&lt;p>（阻塞队列）ArrayBlockingQueue阻塞有界队列，LinkBlockingQueue阻塞无界队列（生产者消费者首选，take方法会阻塞，poll方法没有就返回null）。&lt;/p>&lt;p>这里我们以最经典的生产者消费者模式作为例子&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="966" img_height="741" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p>这里我们顺便做一个延伸，我们用的所有线程池，包括面试时候经常问的要你自定义一个线程池怎么做？我们先看一下线程池的源码。&lt;/p>&lt;p>&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" img_width="812" img_height="153" alt="java多线程高级教程，这些你都懂了吗？" inline="0">&lt;/p>&lt;p>也就是说线程池也是用并发队列作为线程的容器。我们自定义时候也只需要重现实例化ThreadPoolExcutor，设置我们自己需要的参数即可。&lt;br>&lt;/p>&lt;p>六、分布式锁&lt;br>&lt;/p>&lt;p>这个其实已经不属于java代码范畴，但是我上一篇讲基础的时候，一些兄弟说我说的太简单，另一些又说太难，所以我加了一个分布式锁，希望能满足更多人需求。&lt;/p>&lt;p>分布式锁，主要用在分布式集群上，既然是分布式，那就有多个jvm，即使你代码写出花来也不能控制。所以只有一个办法就是借助第三方工具。比如memcache、redis、zk&lt;/p>&lt;p>1. 首先明确一点，有人可能会问是否可以考虑采用ReentrantLock来实现，但是实际上去实现的时候是有问题的，ReentrantLock的lock和unlock要求必须是在同一线程进行，而分布式应用中，lock和unlock是两次不相关的请求，因此肯定不是同一线程，因此导致无法使用ReentrantLock。&lt;/p>&lt;p>2. 基于数据库表做乐观锁，用于分布式锁。&lt;/p>&lt;p>3. 使用memcached的add()方法，用于分布式锁。&lt;/p></description></item><item><title>学习Java需吃透这些基本概念你知道吗？</title><link>https://pangyd.com/post/114-java/</link><pubDate>Sun, 24 Sep 2017 21:14:30 +0800</pubDate><guid>https://pangyd.com/post/114-java/</guid><description>&lt;p>学习好比盖房子，打地基好很重要，房了能盖多高关键看地基；学习同样道理，基础知识是以后学习一切技术的必要条件，我们在准备学习一门开发语言时，首先要学习它的基础，不仅要会，更要融会贯通；万变不离其宗，无论技术框架怎么变，本质都是对基础的封装再造。&lt;div>&lt;br>&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>在以往的工作学习中，我总结了一些Java非常重要的知识点或者说基本概念，好了，进入正题：&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>1、面向对象编程（OOP）:OOP最重要的思想是类,类是模板,从类中构造一个对象,即创建了这个类的一个实例；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>2、封装:是把数据和行为结合在一起，并对对象使用者隐藏数据的实现过程,通常一个对象中的数据叫他的实例字段(instance field) ；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>3、继承:Java中允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>4、多态:在java中,对象变量是多态的；需要注意的是java中不支持多重继承；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>5、类之间的关系:&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>use-a :依赖关系 ；&lt;/div>&lt;div>has-a :聚合关系 ；&lt;/div>&lt;div>is-a : 继承关系&amp;ndash;例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法；&lt;/div>&lt;div>6、构造对象使用构造器:构造器是一种特殊的方法,它的作用是构造对象并对其初始化，&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>构造器特点:构造器可以有0个,一个或多个参数 ；&lt;/div>&lt;div>构造器和类名称是相同的；&lt;/div>&lt;div>一个类可以有多个构造器；&lt;/div>&lt;div>构造器没有返回值；&lt;/div>&lt;div>构造器一定是和new运算符一起使用的；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>7、包(package)：Java允许把一个或多个类放在一起成为一组,称作为包,以便于更好的管理,标准Java库分为许多包如java.lang、java.util、java,net等,包是分层次的，所有的java包都在java和javax包层次内；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>8、重载:当多个方法具有相同的名字而含有不同的参数时,这时就发生了重载，编译器会选出调用哪个方法；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>9、健壮特性:Java采取了一个安全指针模型,能有效防止重写内存和数据崩溃；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>10、安全:Java可以用来构建防病毒和防攻击的系统，事实证明Java在防毒方面做的比较好；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>11、可移植性:Java中对基本数据结构类型的大小和算法都有严格的规定，所以有很好的可移植性；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>12、多线程:由于Java的机制，它处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成，所以多线程是Java作为服务器端开发语言的流行原因之一；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>13、动态绑定:这是Java调用对象方法的机制；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>14、Java中的每一个类都是从Object类扩展而来的；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>15、内部类:一个内部类的定义是定义在另一个内部类中；&lt;/div>&lt;div>&lt;br>&lt;/div>&lt;div>以上只列出了比较重要的，必须掌握的知识点。&lt;/div>&lt;/p></description></item><item><title>啪啪啪！敲代码时你喜欢听什么音乐？下面这些歌单推荐给你</title><link>https://pangyd.com/post/112/</link><pubDate>Fri, 22 Sep 2017 20:38:02 +0800</pubDate><guid>https://pangyd.com/post/112/</guid><description>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>凌晨4点的北上广深，是他们最为熟悉的光景，啃着粗糙的盒饭，穿着格子衬衫，依然保持初恋般真。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>他们日日夜夜坚守在成功的背后，扮演默默无闻的幕后英雄。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>他们的名字是，IT人。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>更多的时候，不光是电脑和键盘陪着我们度过一天，耳机和音乐也成了IT人生活中必不可少的一部分，上班和下班的路上，心情失落时，失眠时，甚至是工作时都可能会听音乐，让音乐为我们疗伤，让精神得以放松。甚至有&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>20年写下1一亿行代码的阿里云神级程序猿为你推荐的歌单&amp;gt;&amp;gt;（https://bbs.aliyun.com/read/288999.html）&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="" style="text-align: center">&lt;img class="" data-src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-ratio="0.3583333" data-w="600" data-type="jpeg" src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-fail="0">&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>&lt;br>&lt;/p>&lt;p>其实在工作时要尽量选择那些技能让我们深信愉悦，激发创造力和想象力但又不会使我们分心的音乐。有人说，适合这种情景的音乐有摇摆乐，爵士乐和蓝调音乐。还有轻音乐，比如班得瑞和神秘园的曲子，非常轻缓，沁人心脾。还有一种就是外文歌曲，歌词完全听不懂那种。甚至还有像这样的专门为程序员提供音乐的网站：&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>&lt;br>&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>musicforprogramming.net/&lt;/p>&lt;/li>&lt;li>&lt;p>https://www.getworkdonemusic.com/&lt;/p>&lt;/li>&lt;/ul>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="" style="text-align: center">&lt;img class="" data-src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-ratio="0.7857143" data-w="280" data-type="jpeg" src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-fail="0">&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>&lt;br>&lt;/p>&lt;p>为了高效的工作要时刻的保持身心的预约，听歌是一个不错的选择，&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>比如：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>T姐还在的时候，很多歌都不错，&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>例如&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>ghost love score&lt;/p>&lt;p>ever dream&lt;/p>&lt;p>nemo等等&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>后来&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>A姐来了有一些也不错，例如&lt;/p>&lt;p>bye bye beautiful等等&lt;/p>&lt;p>还有贝斯手marco唱的&lt;/p>&lt;p>while your lips are still red&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>等等，还有一些没词的曲子evanescence的也不错&lt;/p>&lt;p>产品改需求时就听powerwolf的&lt;/p>&lt;p>we drink your blood&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;section class="">&lt;section class="" style="text-align: center">&lt;img class="" data-src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-ratio="1.11" data-w="400" data-type="jpeg" src="https://pangyd.com/uploads/2017/09/74c10f869f038762.jpg" data-fail="0">&lt;/section>&lt;/section>&lt;section class="">&lt;section class="">&lt;section class="">&lt;p>&lt;br>&lt;/p></description></item><item><title>转载自【 Java编程精选】一位程序员工作10年总结了这些忠告</title><link>https://pangyd.com/post/48-java10/</link><pubDate>Thu, 10 Aug 2017 19:46:59 +0800</pubDate><guid>https://pangyd.com/post/48-java10/</guid><description>&lt;p>展望未来，总结过去10年的程序员生涯，给程序员小弟弟小妹妹们的一些总结性忠告。&lt;/p>&lt;p>&lt;strong style="text-align: center">&lt;/strong>&lt;/p>&lt;p>&lt;span>1、自己的户口档案、养老保险、医疗保险、住房公积金一定要保管好。&lt;/span>&lt;/p>&lt;p>由 于程序员行业每年跳槽一次，我不隐瞒大家，我至少换过5个以上的单位，这期间跳来跳去，甚至是城市都换过3个。还好户口没丢掉，其他都已经是乱了，好几个 城市里，都有交过三金，甚至是一个程序的2个区里交的都有，那些东西，10年后，会变得很重要。你买房子若有公积金，可以取出来，贷款利率也会比较低一 些，有孩子了，还需要上学，生病了还需要医疗保险。&lt;/p>&lt;p>&lt;span>2、读&amp;gt;写代码&amp;gt;读&amp;gt;写代码（日复一日）&lt;/span>&lt;/p>&lt;p>关于如何高效学习编程我要给出的第一条建议是在阅读代码和编写代码之间循环往复。阅读代码（书籍，博客文章，开源代码）将帮助你查看解决方案，了解最佳做法，并大致了解语言或系统。但是在你这样做之后，你需要自己实际去写代码。可以是任何东西。可以是小的编码练习或业余项目，但确保你能将之付诸于实践，并用某种方式使用你学到的东西。如果你不这样做，那么你会发现自己面对编辑器会无所适从无从下手。&lt;/p>&lt;p>&lt;span>所有事情所花费的时间总是比你预期的要长&lt;/span>&lt;/p>&lt;p>特别是在编程中，即使一切进展顺利，我们也很难对功能所需的时间做出正确的预算。并且，开发软件时碰到各种意想不到的问题是非常常见的。一个简单的合并操作会导致一系列小bug，一次框架升级意味着一些函数必须改变或者一些API不按照你想象的那样工作。&lt;/p>&lt;blockquote>&lt;p>Hofstadter Law（ 霍夫施塔特定律）其实道出了真谛：做事所花费的时间总是比你预期的要长，即使你在预期中已经考虑了 Hofstadter Law（ 霍夫施塔特定律）。&lt;/p>&lt;/blockquote>&lt;p>&lt;span>先了解现有的代码&lt;/span>&lt;/p>&lt;p>大多数的编码都需要以某种方式改变现有的代码。即使是新功能，也需要适应现有的程序。所以，在你加进去新的内容前，首先需要了解当前的解决方案。否则，你一不小心就很有可能会打破现有的功能。这意味着，阅读代码和编写代码都是必要的技能。这也是为什么看似微小的变化仍可能需要很长时间才能解决的原因之一，因为你首先必须了解上下文。&lt;/p>&lt;p>&lt;span>成为开发者社区的一员&lt;/span>&lt;/p>&lt;p>当我还在大学的时候，我总是懒得参加各种社团和俱乐部活动。当我找到我的第一份开发工作时，最不乐意做的也是和其他开发者闲聊闲逛。&lt;/p>&lt;p>但是我错了。&lt;br>&lt;/p>&lt;p>同行聚会和进入开发群是很有趣的事情，是结识开发者伙伴的好地方。如果你想在这个行业里做到最好，就尽量不要消极被动。与坐在你旁边的人交谈，提供你的帮助，分享你的经验。每个人都喜欢谈论自己的经历，更何况你也许会遇到很多潜在的雇主。&lt;/p>&lt;p>在那里你会碰到许多需要教练的初学者团体，你可以指导新手，给他们提供练手的机会，甚至赞助活动。&lt;/p>&lt;p>当然，要学习别人的开发技巧并且勇于实践，要热情地欢迎不同意见的人讲话，勇敢地听取他们的意见。&lt;/p>&lt;p>&lt;span>编程并不是一件什么神秘的东西&lt;/span>&lt;/p>&lt;p>编程跟其他东西一样，是一门技术。跟语言学习一样，有需要掌握的语法和词汇；跟数学一样，有解决特定类型问题的流程方法；像各种工艺和艺术创作一样，有技术、工具以及人们经年累月发展起来的最佳实践方案，专门解决各种不同类型的任务，你可以自由的使用、修改或弃之不用。&lt;/p>&lt;p>但是编程也不是每个人都可以学好学懂学会的，曾经面试过从培训班出来的新人，一问三不知，最基本的知识点都模糊不清，一问他以前的专业职业，原来是高中没毕业，去了工厂做工人，觉得太辛苦，后来看到培训机构说没基础也可以学习编程，就把挣的钱全送给了培训机构去学习编程。结果呢？很清楚，他选择了不适合他的道路，注定没有出路。&lt;/p>&lt;p>虽然编程不神秘，但是它和美术、音乐、艺术、销售、设计等一样，也分人，也不是每个人都能学会都能干的。&lt;/p>&lt;p>&lt;span>这是一场马拉松，不是百米赛跑&lt;/span>&lt;/p>&lt;p>这三个月对我来说绝对不容易。这三个月，我每周都要辛苦六天用于找工作和学**。不过我还是把自己照顾得很好。&lt;/p>&lt;p>有的时候，我会和朋友一起学。有的时候，我会找个咖啡馆自己一个人学，或者去 Hack Reactor 提供的休息室学。每周我还会和教练报告我的进度。&lt;/p>&lt;p>在这个过程中很容易耗尽热情。那么就吃好，睡好，继续学。&lt;/p>&lt;p>而且会很容易感到孤单。和一群学友们在一起会好一点。&lt;/p>&lt;p>建议：要有长期作战的心理准备，照顾好自己的身体。&lt;/p>&lt;p>&lt;span>开发效率&lt;/span>&lt;/p>&lt;p>开发效率可以用这些方式提升：&lt;/p>&lt;p>1 . 构建公用工具类，方便大家使用&lt;/p>&lt;p>2 . 使用开源的一些包，例如 ORM 思想的数据库等&lt;/p>&lt;p>3 . 可以很快的找到问题。开发中，找 bug 的时间，往往是很多的。我用的方法有3个： 使用 try catch； 拦截所有 crash 到我指定的地方；超多的 Log，Log 有统一的控制开关。&lt;/p>&lt;p>4 . 借力：数据上报用灯塔，崩溃上报用 bugly，公司 KM 上很多经验，拿过来用&lt;/p></description></item></channel></rss>