Software is an integral part of our lives. It controls the cars we drive every day, the ships we send into space, and even our toasters. It is everywhere and we can easily download more. Software solves many real-world problems and satisfies many needs. Thus, unsurprisingly, there is a rising demand for software engineers to maintain existing software and to design and build new systems. Unfortunately, there is a scarcity of software engineers. But thankfully, more and more people are opting or being encouraged to pursue a Computer Science education, and we are seeing an explosion in enrollment worldwide. At UC Davis, for example, an introductory programming course quadrupled in enrollment from about a hundred students to four hundred. Recently, official enrollment at UC Berkeley's introductory programming course was 1,762. Massively open online courses (MOOCs) like Coursera and Udacity regularly sign up thousands of students for a single course. Not surprisingly, however, not everyone who enrolls in CS courses succeeds. A study in 2014 found that, on average, 33% of students fail. Often, these same students decide to drop out instead. For example, Ireland reported that about a third of students drop out of Computer Science degree programs. Undoubtedly, there are many factors contributing to these issues. But perhaps, the most straightforward reason is that programming is simply difficult and challenging. And with larger classes, students are receiving less personalized instruction and intervention. Therefore, we need innovative tools and approaches to help students learn to program. In this dissertation, we focus on "technical barriers to learning programming." We define technical barriers as those challenges that are faced by programmers of all levels but are especially difficult to beginners. These technical barriers can cause students to waste time, to become frustrated, and even to quit. This dissertation describes three efforts addressing these technical barriers from different angles: simplifying the programming environment, assisting with compilation errors, and exploring a syntax-free programming paradigm. Students often spend a considerable amount of time and effort installing and configuring programming tools and environments. This can frustrate, and distract them from more important learning objectives, particularly in introductory programming courses. A web integrated development environment (IDE) can serve as a low-threshold, ready-to-use programming environment, and reduce the time and effort needed to start practicing programming. Moreover, the uniform execution environment can facilitate better interactions between students and instructors. We describe the design and deployment of KODETHON, a web IDE, at a large public university. KODETHON can support multiple programming languages, multi-file projects, and real-time collaboration. To date, more than 3,000 students have used KODETHON in at least 15 different courses to write over 15 million lines of code. We studied student adoption behavior and perceptions of KODETHON by analyzing server database and logs, and by deploying a user survey. We found that about a third of participants perceive KODETHON to be useful. We also found that students find "Web-based" and "No Installation Required" to be the two most useful features. We present lessons learned and provide advice for educators and researchers considering introducing a web IDE as a pedagogical tool. Every programmer, from novices to professionals, makes compilation errors. Resolving compilation errors can be time-consuming, difficult, and frustrating. For decades, error messages have been identified as a source of this difficulty. A promising approach to help programmers is to augment error messages with "compilation repair examples." The challenge is how to obtain and present these repair examples. We present COMPASSIST, a system that generates and refines repair examples. Based on these repair examples, the system suggests possible patches to users when their program fails to compile. We evaluated COMPASSIST on a mainstream C++ compiler, and demonstrate that it can generate examples for more than half (867/1, 686) of compiler errors. We also conducted a user study where participants found these synthetic repair examples to be helpful in a majority (5/9) of tasks involving real-world C++ compiler programs. Lastly, we focus on programming language syntax. Natural language is robust against noise. The meaning of many sentences survives the loss of words, sometimes many of them. Some words in a sentence, however, cannot be lost without changing the meaning of the sentence. We call these words "wheat" and the rest "chaff". The word "not" in the sentence "I do not like rain" is wheat and "do" is chaff. For human understanding of the purpose and behavior of "source code," we hypothesize that the same holds. (Abstract shortened by ProQuest). [The dissertation citations contained here are published with the permission of ProQuest LLC. Further reproduction is prohibited without permission. Copies of dissertations may be obtained by Telephone (800) 1-800-521-0600. Web page: http://www.proquest.com/en-US/products/dissertations/individuals.shtml.]