Yes of course it's possible. However, if you're starting afresh as a novice programmer, then the amount of effort you will need to put in will be about the same as the amount of effort you'd need to put in for a 2-3 year degree course - there's really aren't any "shortcuts". Teaching yourself anything is hard work; it requires a lot of persistence, a lot of trial-and-error, and a lot of time.
Employers are primarily looking for strong evidence of technical and problem solving ability - a degree is only one way to show evidence of this.
With or without a degree, you need to be able to show that you are competent in a fairly broad range of "bread n butter" programming skills (Many which you would normally pick up as part of a degree). The reality is that you can pick up all of them by working on your own projects (and working on other peoples' open source projects), and by spending time online following tutorials, online courses, videos, books, etc. Even on a degree course, most of the things you'll learn are really "self taught" - the only difference with a degree is that you have better access to resources and lecturers. (But without a degree, you still have google, forums, StackOverflow, etc.)
The kinds of things you need to learn includes most or all of the following:
- Be "fluent" and confident using at least one widely-used high-level general-purpose programming language (e.g Java, Python, C#, C++).
- Have a working knowledge of large parts of the standard library for whichever language you're proficient with.
- Understand how to troubleshoot problems using your developer tools; particularly the debugger.
- Confidently able to explain OO tools and concepts (Inheritance, Polymorphism, Encapsulation, Abstraction, SOLID Principles, GoF Design Patterns)
- Demonstrate logical thinking and the ability to trace through some non-trivial code on pen&paper
- Understanding some more advanced programming topics such as concurrency, asynchrony and networking
- Some exposure to databases and SQL - understand 3NF and entity relationship modelling
- Know how to use data formats such as XML or JSON.
- Be able to parse text data, particularly RegEx is useful to know, but common operations such as string splitting, matching, trimming, etc are important
- Grasp common fundamental data types and how those work in different situations - particularly IEEE floating point types, characters, integers, arrays.
- Understand binary, hexadecimal, and be able to apply bitwise operations in code
- Know common data structures and algorithms such as Linked Lists, Binary Trees, Sorting, Searching, Hashing, etc.
- Be able to write automated tests / unit tests in whichever language you use
- Exposure to common development tools - particularly version control systems like git or SVN.
- Able to express ideas using common design notations (which programmers understand) such as flowcharts, UML, ERM diagrams, Pseudocode etc.
There are several stages to applying for a programming job - the first is to make sure that your CV demonstrates that you're technically competent. If you can confidently and truthfully (i.e. without exaggerating the truth) put most or all of those things on your CV, then that's a good start which should get you noticed. Being able to write about any personal projects or open source projects which you've been part of is also helpful.
The second stage is often a technical test where employers are likely to want you to answer questions about code, explain (using your own words) the technical concepts you understand, and probably also write some code to solve a problem. Most worthwhile programming jobs involve these sorts of tests in an interview.
Employers generally look for general signs that you will be able to cope with complexity, and that you will be able to code in a commercial environment - they'll want to know that you understand why coding standards are important, why code needs to be readable, maintainable, that you understand the importance of testing, that you aren't the sort of person who just "re-invents the wheel", can look at some vague high-level requirements and be able to elaborate on those until you have enough information to write software which meets those requirements.
Lastly, it's important to remember that a degree often covers various other aspects of software development aside from the code, and those things are also important. In reality, you will never find a job which expects you to work 'just' as a programmer - nearly all programming jobs require you to do various other tasks related to programming as well, and employers want to know that you can do those - companies don't like hiring "code monkeys" (if they want code monkeys, they can outsource to a low-wage country like India or Ukraine instead). Companies like to hire well-rounded software engineers who solve real problems, so you'll need to demonstrate that you are able to think for yourself when it comes to looking at problems, and that you're capable of being able to work with requirements, design, etc.
Remember that when you're applying for any skilled job, the most important questions any employer will be asking themselves is whether the candidate they're interviewing is actually capable of doing the job, that they're not just going to end up hiring somebody who sits staring blankly into a screen, and that the person they're hiring is able to work on getting on with tasks by themselves without needing to have their hand held.