elonmollusc
Joined 6 years ago
Joined 6 years ago
https://or.stackexchange.com/questions/3209/how-to-choose-be...
The answer, which sounds reasonable to me, is that branching on a binary variable fixes its value, which effectively reduces the dimensionality of the model in subsequent evaluations. Branching on an integer variable restricts its range, but keeps it in the model. It may be easier to add cuts to the binary model.
I also have a copy of Wolsey's Integer Programming that I flipped through, but couldn't find anything clearly relevant to the question.
From a modeling perspective, if you care about the selection of individual items, then individual binary variables seem to be the natural choice. Trying to "compress" ten binary selection variables into an integer from 0 to 10 will be indirect and you'll probably have to add a bunch of extra constraints to encode that a variable assignment like x_c = 2 corresponds to selecting item #2 from category c.
(I have done some OR in the past but I'm not an expert on MIPs, so I defer to anyone with better knowledge.)
Western Governors University is the largest and best-known school with competency-based degrees. They use an online model where you pay a fixed amount per semester, but with no cap on the number of credits you can complete.
Two tips:
1. Don't worry about "impressive" projects. Even the simplest interactive programs will be impressive to new programmers. I have jaded college students that go crazy showing off their third-week rock-paper-scissors programs to their roommates and parents.
2. Think about the environment. If you want to do programming (as opposed to Lego kits or Arduino) you should look into a cloud-based IDE like repl.it so that everyone has the same interface and no one needs to install software. Choose a simple editor that allows them to run programs in one step.
Scratch is good for doing animations, stories, and simple games. The block-based interface becomes clunky and confusing when you try to write larger programs, but it's a good place to start with younger kids who enjoy the creative aspects.
Python is a good choice for writing text-based games. Don't underestimate the power of this approach for teaching new students: They can clearly see the link between what they write and what the program does and then make the leap to coding up their own ideas. It's harder to do that with a self-contained project that relies on external packages and pre-written code.
Twine is an interesting option. It isn't "programming" in the same way that Python is, but it's easy to use and writing interactive stories gets students thinking about sequential logic, conditions, and using variables to manage state.
You'll know you're doing it right when the kids are running with your examples, making up their own projects, and bouncing ideas off of each other.
I have a huge soft spot for Karel the Robot, which was very successful when I used it with my high school students. Look into it if you want a simple, creative predecessor to Python that isn't Scratch. I don't know if there is a high-quality free web-based version currently available.
It's now possible to do an M.S. while you're working. There are now a number of good online programs, with Georgia Tech's OMSCS at the top of the pile. You might want to take a year or so in your current position and then evaluate whether an M.S. would be a career enhancer. The culture of Master's programs nationally is shifting towards working professionals doing their degrees online, so the case for quitting your job to go back to a full-time residential program is going to get weaker and weaker in the coming years.
Ph.D. is a totally different game and a bigger conversation. Short answer: unless you really, really want to work in academia it's not going to be worth the opportunity cost.
I think you've hit on one of the main challenges of teaching as a profession: the good parts, like building relationships with engaged students, have to exist in a system with less-good parts, like tedious administrative work and grading. I don't have to worry about classroom control in my courses, but it's one of the hardest parts of K-12 teaching, depending on the school.
My advice is to just look for opportunities to get in the classroom (which might be virtual) and learn as you gain experience. If you are comfortable teaching in person right now, look at libraries, maker spaces, science centers, or any other public space that offers STEM-related programming. Virtual teaching can be harder (all of my classes are hybrid this semester), but there are platforms like Outschool than can allow you to offer your own small courses.
There's a huge literature of both popular and scholarly books on developing effective teaching. You can look into the Scholarship of Teaching and Learning to find lots of references. Most colleges and universities have Centers for Teaching, and their pages will usually contain resources intended to help new professors and grad students get better at teaching.
If I had to recommend one book, I'd go with Small Teaching by James Lang. It's accessible and rooted in learning science, with an emphasis on techniques and tips you can begin incorporating into classes right away. It builds on, rather than replaces, your existing pedagogy, and the techniques work across disciplines.
The area where most new professors struggle is in course organization. When you know something well, there's a tendency to see it as a gigantic blob of interconnected content. To teach effectively, you have to set overarching goals (at the course level, unit level, and even daily class meeting level) and design your activities to support those goals. The general term for this approach is "backwards design" and the standard text is Understanding by Design by Wiggins and McTighe. It's aimed at K-12 education but everything in it applies to other levels.
The dominant trend in pedagogy, for the past decade, has been the movement away from lecture-dominated presentations and towards active learning. Classes should include a combination of short presentations on content, but supplemented with quick discussions, hands-on activities, or conceptual check-ins to make students engage with the material while it's being presented. Lang's book has a bunch of techniques, and any search for active learning will turn up more ideas. From a scholarly perspective, Carl Wieman's work on physics education has been highly influential.
For teaching across the organization, I'm familiar with work on how faculty cultures around teaching evolve, and how faculty adopt new practices. The key seems to be having small groups of colleagues that trust each other and share tips and advice.
Last point: assessment is another layer that you may or may not care about. If you do, think about how to integrate assessment into the design of your course to support the overall learning outcomes. Wiggins and McTighe describe different kinds of assessments that are appropriate for different part of the class (e.g. daily formative assessments vs. unit or course-level summative assessments). A starting point for thinking about effective assessment is Bloom's Taxonomy, which lays out a hierarchy of complexity for different assessment tasks. I'm a big believer in Specifications Grading, where almost everything is assessed on a two-level satisfactory/unsatisfactory scale.
Teaching is a big part of my life, so let me know if you have follow-up questions and I'll do my best to answer.
For general object-oriented programming and working with lists/sets, write your own versions of classic 2-D arcade games like Snake, Asteroids, Pac-Man, or Breakout. You can use simple geometric shapes and any drawing framework if you don't want to create complex graphics.
Conway's Life, Notakto (2-D arrays)
Frequency-based cipher analysis (easy application of hash tables)
Password cracking (hashing)
Search engine for the plays of Shakespeare: given a word, return the text locations where it occurs (implementing and constructing an index data structure)
Predictive text generators
Simulating queues and theme park rides (priority queues, event-driven simulation)
Stack-based programming language interpreter (stacks, postfix arithmetic, simple lexical analysis)
Generating mazes by building spanning trees (graphs, greedy algorithms)
Spellchecking (using dynamic programming for edit distances)
Writing an interpreter is hard but will tie a lot of things together (lexical analysis, recursive parsing, trees, tree traversals)
I also second the recommendation for coding a simple game like Tic-Tac-Toe or Nim and writing a search-based AI opponent. Great for developing proficiency with recursion.
There are exceptions, but the reality is that it's hard to be established as a researcher without a PhD in the field. CS ed researchers tend to fall into one of three categories:
1. A small number of professors at major research universities who pursue CS education as their main area of scholarship and supervise grad students in the area.
2. Professors at smaller colleges where pedagogy is a big part of the culture (this is me). My college likes it when faculty think critically about teaching and learning and translate that into scholarship, but almost all of us did our original PhD work in areas other than teaching and learning.
3. Faculty (usually called lecturers in the U.S.) who are hired specifically to each intro classes at large universities. Many programs like for faculty in these roles to have PhDs, but there are also options for people with Master's degrees.
Here are the other options I can think of. There are a number of companies that provide infrastructure for coding classes (GitHub, Codio, Mimir, repl.it) and are involved as sponsors or presenters within the CS Ed community. You might also have options at nonprofits or foundations that are focused on equity and access in STEM. A third option could be a teaching position at a private high school, where you could work with students and publish about your experiences, although it might be hard to get institutional support for scholarship at the pre-college level.
One last comment: in the U.S., demand for faculty at teaching-oriented colleges has been far higher than supply for several years. From personal experience, I can tell you that PhD graduates from good programs with proven teaching experience are hard to find. Hiring is going to be rough for the next few years while we work through the enrollment implications of the pandemic, but demand for CS courses will continue to remain high and I expect that hiring for CS faculty will be among the first to rebound in a couple of years.
If you're going to pursue undergrad research, I don't recommend choosing based on field, but based on potential supervisors. Who are your favorite professors? What subjects have you really enjoyed and would like to explore further? A good project is at the intersection of what you're interested in, what your faculty mentor can realistically supervise, and what you can complete and bring to a good result in 1-2 years. You're going to get the best experience if you're able to work with a faculty mentor you like that can teach you about the research process and devote time to mentoring you. Those skills, more so than any specific project you complete, are what will help you be successful in grad school.
There are probably examples of successful researchers who started in one area as undergrads and stayed with it for decades, but it's more common to switch as your interests change and you get more exposure to different subareas of CS, particularly once you get into a grad program and get more exposure to the open problems in different fields. Grad schools will not require you to stick with the area or theme of research that you may have been pursuing when they accepted you.
To give you a concrete example: my first undergrad research project was writing a simulator for acoustic reverb. I continued working with the same advisor, but we switched to projects related to imaging and remote sensing, which led to experimenting with weird neural network architectures (before the current boom in deep learning really took off) and their applications to multispectral imaging. When I started my Ph.D. program, I was originally working on nonlinear optimization and its applications to sensors, but ended up switching to performance modeling and queueing theory, which became the subject of my dissertation. My research has evolved even more since I became a faculty member and shifted to working with real undergrads; I've recently been doing a lot of qualitative research with community organizations about their uses of data and analytics, which is only tangentially related to traditional disciplinary CS research.
Ordinarily, I would say that the job market is strong for good candidates interested in teaching CS (demand has been higher than supply for at least the last five years), but the pandemic has put almost all universities into hiring freezes, mine included. I would expect only a small number of searches next year, with more openings happening in 2021 or 2022. My program has at least one position that we need to fill but I'm not planning on a search until Fall 2021 at the earliest.
I'm assuming from how your question is written that you're not looking at a tenure-track assistant professor position. That leaves you with two main kinds of teaching jobs:
1. Adjunct positions, where you're paid a (low) fixed rate to teach a specific class. Adjuncting can be a way to get some classroom experience and decide if you like teaching, but it isn't a career, there's no stability, and it's basically impossible to earn a living wage.
2. Full-time salaried not-tenure track teaching positions. These are usually advertised (in the U.S.) as lecturers, and typically run on one to three year contracts. Some schools offer "security of employment" to established lecturers, which is like a tenure guarantee: you're ensured reappointment as long as the program is financially viable. Teaching loads can vary from one or two huge courses per semester at a large university to three or four small classes.
Most ads want minimum of a Master's degree in CS or a related field for their teaching faculty, which is partly due to meeting accreditation requirements. It's more difficult, but possible, for Bachelor's degree holders with significant industry experience to be appointed. The term "Professor of the Practice" is sometimes used for teaching faculty with an industry background.
Universities are typically looking to their teaching faculty to cover the core undergraduate classes, so the ability to teach across standard basic and intermediate courses is helpful: intro programming, data structures, web development, etc. Take a look at the curricula for the colleges you're interested in and see how your experience can fit with the classes they would need. Having experience in NLP/ML could make a difference---teaching faculty in those areas have been extremely rare recently---but any program would still want the ability to contribute to the standard undergrad curriculum.
Other things to think about:
- Salaries can range from not great to pretty okay, depending a lot on the school and location. You will almost certainly be giving up a lot of income compared to what you could make as an experienced NLP/ML engineer in industry.
- When applying, think about your teaching philosophy and how it connects to the mission and philosophy of the institution. Give concrete examples of things you have done in the classroom and what you've learned. This will set you apart.
- Analytics is also a growth area, so positioning yourself for those roles will open up more options. An interdisciplinary analytics program may also place higher value on candidates that have industry experience. Again, I wouldn't expect a lot of job postings in the next year, but there will be more options once university budgets stabilize.
- Last point: you have to pay attention to the financial viability of any school you're applying to. Everyone is going to get crunched next year, but institutions that were already vulnerable pre-COVID are going to be closing or drastically reconfiguring themselves in a desperate bid for survival. Medium term, the CS and analytics fields are going to continue to be in demand.
Here's what I would tell one of my students: If you're wondering whether you should do a PhD, the answer is no. At least not right away. Slouching into grad school without a strong commitment and a plan is a bad idea.
The most challenging parts of grad school aren't the academics. It's the long process, low pay, getting older, and uncertain outcomes that wear people down. If you aren't sure (yet) that you really want to do a graduate degree, you should try something else for a few years, then think about returning to grad school if you still have a desire to do research.
I worked for a few years between finishing my first degree and entering a PhD program. Those years were helpful in shedding the "undergraduate student" mentality and thinking of myself as a professional. Industry can also expose you to new problems and research areas that you never encountered in your undergrad program.
In terms of careers, you don't need a PhD for industry, outside of a small percentage of research positions. Academia is a different game and a PhD is required, but there are many different types of institutions that are looking for different things from their faculty. Teaching and advising students is the largest part of my job. We have publishing requirements for tenure, but the research culture isn't as grinding as it would be at a top-tier R1 department.