Monthly Archives: June 2011

Liberated by Giving Up Free Will

Yesterday I posted my review of the book “Incognito: The Secret Lives of the Brain” by neuroscience professor David Eagleman. The book overturns many commonly held ideas about free will and personal responsibility. Another good introduction to Eagleman’s ideas can be found in his Atlantic Magazine article titled The Brain on Trial.

The belief in free will often gives many people an excuse to ignore downtrodden human beings while saying that people in poverty deserve their fate since they made “poor choices” in life. Professor Eagleman, on the other hand, offers a science-based message of forgiveness and rehabilitation while simultaneously protecting society from violent people. In this post, I’m going to describe the benefits of giving up obsolete ideas regarding free will. Giving up the belief in free will can paradoxically lead to improvements in willpower.

I used to believe that taking total responsibility for everything in life was an empowering stance. Now I realize that genes, childhood environment, and even fetal environment determine many aspects of a person’s life before they’re even aware of who they are. I’ve found that giving up the idea of free will can be incredibly liberating. Believing that free will doesn’t exist takes a heavy weight off your shoulders. Knowing that mistakes aren’t your fault is more valuable than believing your successes are due to hard work. This is due to the psychological principle known as loss aversion, where most people are more motivated to avoid losses than to seek gains.

Many societal discussions revolve around choice, such as the importance of making “good choices” and the dangers of making “poor choices.” People sometimes look down on others and ridicule other people’s decisions as a mechanism for reassuring themselves that they made the right decisions at crucial points in life. The anxiety over constantly making decisions and worrying about making the right ones causes many people great distress. They’re worried about making bad decisions and losing their livelihood or being shunned by other people. To deal with the anxiety of perceived total personal responsibility in a world with a disrupted social fabric and inadequate or unscientific social safety nets, probably half of the country is on psychiatric drugs:

Prescription Drug Stats a Bitter Pill to Swallow

Except for a small number of Mormons, the other half of the country is on different drugs – like alcohol, nicotine, and caffeine. I don’t know about you, but I’m tired of politicians and pundits telling people that the solutions to their problems revolve around taking personal responsibility. Decades of moralizers telling people what to do hasn’t reduced binge drinking or obesity or the dropout rate or percentage of births outside of wedlock. Improving the prefrontal cortex and dopamine system has a greater impact on a person’s life than just telling him or her to be more responsible.

Paradoxically, the act of disbelieving free will may actually give people more will power and control over their life, as the following neuroscientist explains:

• Free Will is in the Brain (warning: this post may change your brain)

Other people with knowledge of the brain – like psychology professor Jesse Bering – have referenced a study that discusses the potential dangers inherent in giving up the belief in free will:

Scientists say free will probably doesn’t exist, but urge: “Don’t stop believing!”

My rebuttal to that study is that it’s like most psychology studies, which means that it involves undergraduates in an artificial environment. Secondly, relying on the illusion of free will and expecting people to behave morally is probably less effective than structuring societies and pharmaceutically engineering the brain in a way that makes morality the most effective and pleasurable option.

Luckily my unconscious brain has figured out that there are three important strategies in life which are key to operating in the absence of free will.

1. Ensuring survival of yourself and the human race: All other strategies are irrelevant if a person ignores self-preservation. Life would also be inadequate without other people.

2. Being nice to people: This doesn’t mean being a pushover. Being nice in this context means behaving in a way that maximizes the chances of positive reciprocation.

3. Basing decisions on scientific evidence: Scientific causality determines everything that happens in the world, such as the use of energy and natural resources, the outcome of status games among people in business, physical and mental health, etc.

Another strategy that may be important at various times involves paying lip service to the idea of free will and maintaining the illusion while in the company of believers. This involves being a social chameleon around people like powerful politicians and religious leaders. This would involve pretending to endorse the importance of personal responsibility and accountability, while actually knowing the truth.

Updated 6/13/2012

Incognito by David Eagleman

The book Incognito by neuroscience professor David Eagleman is one of those books that could change everything. The book sets out to describe how the brain actually works and manages to do a really good job in a fairly brief book. The book introduces examples of neurological conditions and personality traits to illustrate Dr. Eagleman’s ideas about the brain. Better knowledge of the brain could improve education, the legal system, and health. Out of the 40 or 50 books I’ve read about neuroscience, this is the best one so far.

Here are some major points from the book:

• Most of what people do and think and feel is not under conscious control.

• We don’t have access to many of the automatic processes that gather information about the world and performs actions.

• Awareness of the world around you only happens when sensory inputs go against expectations.

• The senses can be fooled. Trust data and instruments, not your senses.

• Implicit egotism describes the tendency of people to love reflections of themselves in others.

• The mere exposure effect is the process where people develop greater fondness for a person, object, or idea when they are repeatedly exposed to the stimulus.

• The illusion-of-truth effect is when a person is more likely to think a certain belief is true if they have heard it before (even if it isn’t actually true).

• The brain is a team of rivals that goes about achieving goals in different ways.

• We have ways of thinking about actions in retrospect that are actually totally fabricated.

• Consciousness exists to distribute control over the brain’s automated systems.

• One potential way of measuring consciousness is on a continuum. Animals with hardwired input-output subroutines would be on one end. Animals with the ability to coordinate, delay gratification, and learn new programs would be on the far end.

• Rather than thinking of the best way to solve a problem, a better option might be to cultivate approaches that attack the problem in multiple and overlapping manners.

• When your biology changes (such as when the frontal lobe is damaged), your desires and ways of making decisions also change.

• Small changes in brain chemistry can cause major behavioral changes.

• People’s brains can be vastly different depending on their genetics and environments. Both nature and nurture are already chosen for you and give you little choice in the matter.

• Every part of the brain is closely interconnected with other parts of the brain and influenced by the other parts. This suggests that no part is independent or has free will.

• Criminals didn’t choose to commit their crimes, but they still need to be put in jail to prevent them from harming other people.

• Traits like indulgence, lack of motivation, and poor discipline are actually biological problems.

• Criminal behavior should be seen as a medical condition.

• Repairing the frontal lobes could improve impulse control and reduce crime.

• People are not created equal, since evolution generates variability in traits to find the best organisms suited for the environment.

• People have little capacity to choose their actions, motivations, and beliefs.

• Even small amounts of damage to the brain can lead to the loss of specific abilities.

• Most diseases are polygenetic and the genome can only really be understood in context with environmental interactions.

• There’s no guarantee that there’s a connection between quantum mechanics and consciousness, but it’s also wise to avoid totally dismissing such a connection for now.

Java/J2EE Job Interview Companion

For background information on this post, please see Preparing for Programming Interviews.

The book “Java/J2EE Job Interview Companion” is a very readable and understandable book. It covers a huge amount of information about Java programming and enterprise development. The author’s guide to Java development is located at the homepage for the book at this link:

http://stores.lulu.com/java-success

Here are some of the topics covered by the book:

Java

• differences between Java and other platforms & languages

• class loaders (static class loading, dynamic class loading)

• constructors

• object oriented programming (polymorphism, inheritance, encapsulation, and dynamic binding)

• design by contract (preconditions, postconditions, class invariants)

• classes (mutable and immutable, outer and inner)

• interfaces

• methods (comparison, non-final methods, key class)

• Java collections framework (list, set, map, comparable interface, comparator interface, iterators, factory methods, best practices)

• serialization

• Java I/O (streaming, decorator design pattern, channel class, selector class, buffers, reactor design pattern, improving I/O performance)

• cloning (shallow cloning, deep cloning)

• variables (instance variable, static variable)

• modifiers (access modifiers, final modifier, other modifiers)

• stack and heap memory

• casting (type casting, up casting, down casting)

• garbage collection (unreachable objects, references)

• error handling (errors, runtime exceptions, throwing exceptions, checked vs. unchecked exceptions)

• flow control (looping, decision making, branching, exception handling)

• threads (creation, thread states, synchronization, communication, blocking)

• design patterns (singleton, factory method pattern, abstract factory pattern)

• sockets

• J2SE (generics, metadata, autoboxing, auto-unboxing, enhanced “for” loop, enumerated type, static import, formatted output, formatted input, varargs)

• Swing (GUI clients, Action architecture, Swing painting, event dispatcher, MVC, layout managers, event delegation model)

• applets (method invocation, communication, signing)

• improving performance (pooling, caching, etc.)

• memory leaks (detection, minimization, JVM crashes)

Enterprise Java

• J2EE components (applet, application client, web component, Enterprise JavaBeans, enterprise application, resource adapters)

• J2EE API (component model technology, web services technology, other)

• J2EE architecture and tiers (client tier, presentation tier, business tier, integration tier, resource tier)

• J2EE MVC (model, view, controller)

• deployment descriptors

• class loaders

• servlets (request parameters, request attributes, thread safety, requests, clustering, filter, URL mapping)

• session management (maintaining state, cookies, state mechanisms, servlet life cycle)

• directory structure (public and private directories)

• J2EE design patterns (front controller, composite view, view helper, dispatcher view, service to worker)

• JSP (requests, validation, Post/Redirect/Get pattern, synchronizer token pattern, front controller pattern, life cycle, elements, scope values, includes, implicit objects, JSP expression language, URL mapping, JSTL, custom tags, best practices)

• JDBC and JTA (DAO, statements, transactions, transaction demarcation, concurrent transactions)

• JNDI

• LDAP

• RMI (architecture, remote objects, services, passing parameters, tunneling)

• Enterprise JavaBeans (container, deployment, pooling, persistence, types of beans, transactional attributes, isolation levels, exception handling, concurrency control, container security, best practices, business delegate, session facade, value object pattern, fast lane reader, service locator, lazy loading)

• JMS (messaging, Message Oriented Middleware, architecture, performance, durability, message header, message delivery design decisions, XML and JMS, security)

• XML (SAX parser, DOM parser, DTD, XSD, XSL, JAXP, JAXB)

• Databases (joins, normalization, relationships, object mapping, views, database triggers, SQL functions, keys)

• RUP and UML (inception, elaboration, construction, transition, use case diagrams, class diagrams, package diagrams, object diagrams, sequence diagrams, collaboration diagrams, statechart diagrams, activity diagrams)

• Struts (client, controller, validation, action mapping, Struts design patterns)

• Servers (web servers, application servers, virtual hosting, clustering, JMX, portals, portlets)

• best practices and performance considerations (J2EE application server performance tuning, J2EE best practices, JSP best practices)

• logging, testing, and deployment (Log4J, test phases, deployment environments)

• Agile software development (extreme programming, feature driven development, test driven development, Scrum)

How Would You Go About?

• documenting

• designing an application

• identifying performance and memory issues

• identifying thread-safety issues

• identifying transactional issues

• applying object oriented design concepts

• applying UML diagrams

• describing elements of agile software development

• applying design patterns (factory method pattern, abstract factory pattern, singleton pattern, builder pattern, strategy pattern, decorator pattern, adapter pattern, visitor pattern, iterator pattern, template method pattern, composite pattern, facade pattern, observer pattern, command pattern, proxy pattern)

• designing a web application with the business tier on a separate machine from the presentation tier

• determining security requirements (authentication, authorization, data integrity, confidentiality and privacy, auditing, SSL)

• ensuring code security

• describing open source projects (JUnit, Ant, CVS)

• using web services (SOA, web services, SOAP, WSDL, UDDI, JAX-RPC, JAXR, SAAJ)

Emerging Technologies and Frameworks

• test driven development

• aspect oriented programming

• attribute oriented programming

• dependency injection

• O/R mapping

• Hibernate (configuration, SessionFactory, Session, objects lifecycle, querying databases, attributes, persistent classes, Hibernate best practices)

• web development (JSF, Tapestry, Struts, Spring MVC, AJAX)

Algorithms for Interviews

For background information on this post, please see Preparing for Programming Interviews.

The two authors of this book are intelligent and experienced computer scientists:

• Dr. Adnan Aziz is a professor at the University of Texas at Austin and also worked at Google.

• Dr. Amit Prakash is a member of the technical staff at Google.

The first half of the book is dedicated to problem-solving techniques, interview strategies, and algorithm problems. The last half of the book lists the solutions to the problems. This post has some notes from the book. The book itself has much more information as well as helpful examples.

Problem Solving Techniques

• Divide and Conquer – dividing a problem into smaller subproblems

• Recursion and Dynamic Programming – creating a solution to a problem by looking at solutions to smaller subproblems0

• Case Analysis – splitting input and execution into cases and solving each case separately

• Generalization – generalizing from the problem to a problem that is easier to solve

• Data structures – finding a data structure that directly applies to the problem

• Iterative refinement – formalizing a brute force approach to a problem

• Small examples – finding a solution to concrete instances and creating a solution that can be used in arbitrary instances of the problem

• Reduction – using a problem with a known solution as a subroutine

• Graph modeling – describing the problem using a graph and solving it using an existing algorithm

• Write an equation – expressing the relationships in the problem in the form of equations or inequalities

• Auxiliary elements – adding some new element to the problem

• Variation – solving a slightly different problem and applying the solution to the current problem

• Parallelism – identifying subproblems that can be solved independently on different machines

• Caching – storing some of the computation to look it up later

• Symmetry – finding and exploiting symmetry in the input space or solution space

Searching

• binary search

• hashing

• binary search trees

Sorting

• mergesort

• heapsort

• quicksort

• radixsort

• max-heap

Meta-algorithms

• dynamic programming

• greedy algoritms

Algorithms on Graphs

• graph search

• advanced graph algorithms (matching, shortest paths, max flow, minimum spanning tree)

Algorithms on Strings

• manipulating strings

Intractability

• solving intractable problems with: brute-force solutions, branch-and-bound techniques, approximation algorithms, heuristics, and parallel algorithms

Parallel Computing

• provides high performance, better use of resources, fairness, convenience

• shared memory model

Design Problems

• making a high level sketch of a system and describing the tradeoffs, algorithms, and data structures involved

Discrete Mathematics

• invariants

Probability

• random variables

• option pricing

Programming

• bit fiddling

• arrays

• linked lists

• complexity analysis

• basics

• libraries

• building and maintaining programs

• shell tools

Interview Strategies

• clarifying the question

• working on small examples

• describing the brute-force solution

• thinking out loud

• searching for isomorphic problems

• testing for corner cases

• ensuring correct function signatures

• avoiding memory management

• checking for syntax errors

• showing that you can communicate complex ideas in simple ways

• showing your passion for the work

• demonstrating how your interests match the needs of a project

Programming Interviews Exposed

For background information on this post, please see Preparing for Programming Interviews.

Programming Interviews Exposed is a book that describes technical interview scenarios and possible solutions.

Here are some major areas covered by the book:

Approaches to Programming Problems

• Steps to solve programming problems: understanding the problem, trying an example, finding the algorithm you will use to implement a solution, explaining your solution, asking questions of the interviewer, verifying the code is correct, and checking the code for errors

• Overcoming areas where you get stuck by going from a specific example to a general case, trying a different data structure, or using advanced aspects of a language

• Discussing tradeoffs between your solution and another possible solution

Linked Lists

• singly-linked lists

• doubly-linked lists

• circularly-linked lists

• tracking the head element

• traversing

• inserting and deleting elements

• Examples: stack implementation, maintain linked list tail pointer, mth-to-last element of a linked list, flattening a list, unflattening a list, determining whether a list is cyclic or acyclic

• bug finding (checking the data that comes into a function, checking each line of a function, checking the data that comes out of a function, and checking common error conditions)

Trees and Graphs

• aspects of trees (parent, child, descendant, ancestor, leaves)

• binary trees

• binary search trees (including lookup)

• heaps

• common searches (breadth-first search, depth-first search)

• traversals (preorder, inorder, postorder)

• graphs

• Examples: preorder traversal, preorder traversal (no recursion), lowest (nearest) common ancestor

Arrays and Strings

• arrays in C/C++, Java, C#, and JavaScript

• strings in C, C++, Java, C#, and JavaScript

• Examples: find the first nonrepeated character, remove specified characters, reverse words, integer/string conversions

Recursion

• recursive cases

• base cases

• Examples: binary search, permutations of a string, combinations of a string, generating words based on a telephone number

Concurrency

• Thread Concepts (threads, system threads versus user threads, monitors and semaphores, deadlocks)

• Examples: busy waiting, producer thread and consumer thread, dining philosophers

Object Oriented Programming

• classes and objects

• inheritance and polymorphism

• construction and destruction

• Examples: interfaces and abstract classes, virtual methods, multiple inheritance

Databases

• relational databases

• SQL

• database transactions

• Examples: simple SQL, company and employee database, maximum value (with no aggregates), ternary logic

Other Programming Topics

• graphics

• bit manipulation (binary two’s complement notation), bitwise operators, optimizing with shifts

• Examples: drawing the upper eighth of a circle, determining whether two rectangles overlap, determining whether a computer is big-endian or little-endian, determining the number of 1 bits in the representation of an integer

Counting, Measuring, and Ordering Puzzles

• Solving brainteasers: reminding yourself that the most obvious and hardest answers are usually not the right answers, identifying assumptions, categorizing assumptions according to their level of correctness, breaking a problem into parts, first solving a simplified version of the problem, and working through a few specific examples

Graphical and Spatial Puzzles

• Solving spatial puzzles: drawing a picture, drawing pictures of a scene at multiple points in time

Knowledge-Based Interview Questions

• being prepared to answer questions about anything on your résumé

• knowing about system-level issues, trade-offs between programming techniques, and advanced features of programming languages

• Examples: C++ versus Java, friend classes, inheritance, garbage collection, network performance, cryptography, cryptography algorithms, hash tables versus binary search trees

Nontechnical Questions

• ensuring that you have relevant experience

• ensuring that you can work well with the team

• balancing sounding enthusiastic while not sounding desperate

• Examples: what you want to do in a job, favorite programming language, work style, previous assignments, career goals, motivation for job change, salary negotiation, asking thoughtful questions

Résumés

• highlighting your achievements

• being concise

• listing relevant keywords for skills

• focusing on relevant information

• using reverse chronological ordering

• proofreading

• Sample résumés: developers, senior developers, and managers

Cracking the Coding Interview

For background information on this post, please see Preparing for Programming Interviews.

Like the book The Google Resume, Cracking the Coding Interview is also written by Gayle Laakmann McDowell. She is the founder of CareerCup and a software engineer at Google who interviewed over 100 candidates for engineering positions. This book tends to focus more heavily on sample programming questions and answers. The book is divided into three major parts. The first 50 pages cover general job searching advice. The next 50 pages include sample questions about programming and other software topics. The last 200 pages discuss solutions to the sample questions.

Here are some major points from the first part of the book:

• Showing interviewers that you are dependable and easy to work with

• Demonstrating that you can get the job done

• Making an accomplishment-based resume that shows what you did, how you did it, and the results

• Listing programming languages that you’ve used along with your experience level

• Preparing for behavioral interviews by reviewing stories that illustrate what you’ve accomplished and structuring answers using the Situation, Action, Result format

• Preparing good questions in advance to ask the interviewers

• Gaining knowledge of data structures, algorithms, and design patterns

• Steps for answering technical questions and solving algorithm problems

The sample questions and answers cover these areas (items in parentheses are called out for extra emphasis in the book):

• Data Structures (Hash Tables, ArrayList, and StringBuffer)

• Linked Lists (creating a linked list and deleting a node from a singly linked list)

• Stacks and Queues (implementing a stack and implementing a queue)

• Trees and Graphs (binary trees and graph traversal)

• Bit Manipulation (left shift and right shift)

• Brain Teasers (strategies include talking out the problem, simplifying, generalizing, and working backwards)

• Object Oriented Design

• Recursion (thinking about sub-problems, solving for a base case, and generalizing)

• Sorting and Searching (bubble sort, selection sort, merge sort, quick sort, bucket sort)

• Mathematical (Bayes’ rule and probability)

• Testing (how you would test a piece of software or write test cases/test code)

• System Design and Memory Limits

• C++ (pointer syntax, class syntax, C++ vs. Java)

• Java (classes & interfaces)

• Databases (designing both small and large databases)

• Low level (big vs. little endian, stack, heap, malloc)

• Networking (http requests, tcp)

• Threads and Locks (deadlock conditions, deadlock prevention)

The Google Resume

For background information on this post, please see Preparing for Programming Interviews.

The Google Resume is a book written by Gayle Laakmann McDowell, who was a software engineer at Google and interviewed over a hundred engineering candidates. She is the founder of CareerCup. The book has many examples to illustrate the recommendations the author makes.

Here are some major points in the book:

• Developing a strong career background with: a track record of achievement, communication skills, showing leadership, finding or being a mentor, developing specific and tangible skills

• Compensating for a low GPA with a combination of passion and specific skills

• Getting to know professors by getting involved in their research, asking them for help, becoming a teaching assistant

• Making an impact by improving the lives of coworkers, being very skilled at what you do, proactively soliciting feedback, learning about other teams, and then quantifying your impact

• Volunteering for nonprofits in a way that shows you gained skills in sales, marketing, and engineering

• Starting a side project as a student to gain attention from recruiters

• Using keywords in your resume that match exactly what a company is working for

• Contacting a recruiter or hiring manager directly instead of submitting an application through a job web site

• Getting personal referrals, which are the best way to get jobs

• Being helpful to employees at a prospective dream company (such as helping them find useful information)

• Contacting recruiters in a well-researched way instead of spamming them

• Preparing for career fairs by: researching companies, preparing questions, preparing answers to basic questions, preparing an elevator pitch, tailoring your résumé to each position, dressing appropriately, and following up

• Networking by immersing yourself in the startup community

• Making a résumé that: describes accomplishments, quantifies results, is tailored to a specific position, is meaningful to both recruiters and engineers, is professional and concise, and is structured to differentiate you from other applicants

• Sticking to a one page résumé that is relevant to the position

• Making a cover letter by describing qualifications in a way that matches what a company wants

• Finding references who: have worked directly with you, speak well of you, understand the position you’re applying for, and are eager to help

• Demonstrating these traits in interviews: passion for technology, excitement about the company, creativity, initiative, getting things done, and intelligence

• Preparing for interviews by: practicing your pitch, reviewing your résumé, studying the company and its products, analyzing your interviewer based on social networking profiles, preparing questions for the interviewer(s)

• Keeping the attention of interviewers by: varying your speech, telling stories, being concise instead of rambling, and giving a sense of structure to your responses

• Ways to project confidence: eye contact, matching the interviewer’s volume, and watching out for nervous habits

• Thanking the recruiter and interviewer

• Using good communication skills by: listening fully to the interviewers’ questions, clarifying ambiguity in interview questions, and solving problems out loud

• Preparing for programming questions:

1. Trying to solve the problem on your own

2. Writing the code for the algorithm down on paper

3. Testing the code by hand

4. Typing the code into a computer exactly

5. Listing the mistakes you made and analyzing them

• Answering coding questions in an interview:

1. Asking your interviewing questions about the problem

2. Designing an algorithm

3. Writing pseudo-code first (and telling the interview that’s what you’re doing)

4. Writing the code (at a medium speed)

5. Testing the code and carefully fixing any mistakes

• Ways of creating an algorithm: figuring out a general rule based on examples, relating a problem to similar ones, simplifying and generalizing a problem, solving an algorithm for a base case and then for other elements, and trying to apply each data structure from a list of data structures

Other parts of the book discuss:

• how to best answer questions about object-oriented design, scalability, and testing

• applying to gaming companies

• how to evaluate job offers

• how to negotiate salary terms

• defining your career path

• managing performance reviews

• deciding whether or not to return to school

Preparing for Programming Interviews

I recently had the opportunity to interview candidates for software engineering positions at both the entry level as well as senior level jobs. After talking with software engineers who have conducted more interviews than me, some ways of predicting performance emerged. A good candidate will have:

• prior success in the same type of job

• the ability to perform the type of tasks needed for the current job

• raw intelligence

• problem-solving skills

• a personality that’s a good fit for the team (an affirmative answer to the question “would you like working with them every day?”)

Some interviews also test for broader knowledge of programming and computer science. That’s led to a cottage industry of books that train people to answer questions about subjects like data structures and algorithms on a whiteboard in high-pressure situations.

I wanted to improve my knowledge of the software engineering interview process so that I could improve my skills at evaluating candidates and pick the best person for the job. I also want to be compassionate and fair to people who go through the time-consuming and stressful process of interviewing. I was also looking for potential shortcuts to rapidly expand my own knowledge of programming and software development.

I bought the most popular books on preparing for programming interviews on Amazon. These books have the following criteria:

• Recently published, meaning they are relevant to the software industry today

• Written by a qualified author who has experience interviewing candidates and/or preparing candidates for interviews

• Good reviews from software engineers

My next five posts will discuss five of the most popular books about programming interviews:

The Google Resume – written by former Google engineer Gayle Laakmann McDowell, who participated in interviews with over one hundred candidates for software engineering jobs at Google

Cracking the Coding Interview – a guide to sample software engineering interview questions and answers also written by Gayle Laakmann McDowell

Programming Interviews Exposed – a popular guide to programming interviews

Algorithms for Interviews – a guide to algorithms written by two computer scientists

Java/J2EE Job Interview Companion – covers some of the most frequently asked questions in Java programming interviews

Save the Microbiome Save the World

After reading extensively about health topics, I realized that the world would be a better place if more people could improve the health of their digestive ecosystems. Research continues to accumulate which shows the important impact of gut flora and the microbiome in human health. These following news stories cover only a small selection of recent research that demonstrates the power of the microbiome:

Healthy gut flora could prevent obesity

Seeking to prevent asthma, scientists ponder ‘Good’ and ‘Bad’ bacteria

That anxiety may be in your gut, not in your head

Healing the gut flora could lead to major improvements in digestion and quality of life for many people. Upgrading the microbiome could fix many illnesses, including mental health problems. That would in turn make human society better, since fewer people would be sick and irritable.

I had a brief conversation with James Altucher about the topic in the comments of his blog post Plug All of Your Leaks or You Will Die.

Me: As I learned recently, people need to plug any leak that gets severe enough to impact gut health. Research continues to show that the health of the gastrointestinal system is really important to mental well-being. The state of the microbiome (gut flora) can affect behavior. I learned from personal experience that people need to do anything possible to fix the gut to fix the leaks in their life. Luckily there’s plenty of medication, meditation, special diets, supplements, and lifeforms (probiotics) to do the job.

James: Met someone recently who told me that all illnesses can be traced to the stomach and diet. Don’t know if it’s true but it certainly seems related to that and lack of sleep.

Here are a couple of resources for learning about microbiota and their impact in digestive health and healing illness:

The Probiotics Revolution – an extensive and helpful book written by Dr. Gary Huffnagle, who studies probiotics and cured his own allergies by taking probiotic foods and supplements

Human Microbiome Project DACC – the central repository of data gathered from studying the human microbiome

Designing Weight Loss Medication

This isn’t a rigorously researched and cited blog post. I mainly wanted to jot down some ideas based on things I’ve read recently on biotechnology sites about failed weight loss drugs. If a company could successfully create a medication to help people lose weight with minimal side effects, that company could be the new Google (or Amgen, to keep the comparison within the same industry). Such a company would practically mint money from customers who desire both health and aesthetic improvements.

However, this post isn’t directed at people who are just somewhat overweight. I’m skeptical of traditional BMI measurements and don’t want to promote eating disorders. Instead, these ideas are designed for morbidly obese patients who are at risk of illness or death unless they quickly lose weight.

Some previous attempts at creating weight loss medications have met with failure:

• Researchers thought that medications that affected the endocannabinoid system could speed up weight loss by reversing the process whereby marijuana causes the munchies. Unfortunately, the medications also led to depression.

• Some medications sought to help people lose weight by inhibiting fat absorption. Unfortunately, nutrition researchers have really dropped the ball over the last few decades. Sugar, grains, and vegetable oils are the true nutritional causes of obesity, not saturated fats.

Many people have had success losing weight on paleo, low carb, or ketogenic diets combined with exercise. Those options are preferable to taking medications that could have side effects or unintended consequences.

For people with more severe obesity problems, the following therapies might be successful and preferable to surgeries like gastric band:

• Improving leptin sensitivity and food reward – People who lose weight on low carb diets are able to accomplish it through the satiating effects of protein and fat. Medication could speed up the restoration of leptin sensitivity and help people get over their sugar cravings.

• Antiviral medications – Adenovirus 36 has been implicated as a contributor to obesity. Eradicating it and similar viruses could help reduce fat storage.